Comportamiento extraño con objetos y console.log [duplicado]

Resuelto dan-klasson asked hace 10 años • 2 respuestas

Este código:

foo = [{id: 1},{id: 2},{id: 3},{id: 4}, {id: 5}, ];
console.log('foo1', foo, foo.length);
foo.splice(2, 1);
console.log('foo2', foo, foo.length);

Produce el siguiente resultado en Chrome:

foo1 
[Object, Object, Object, Object, Object]  5
    0: Object
    1: Object
    2: Object
    3: Object
    length: 4
    __proto__: Array[0]
     5 (index):23
foo2 
[Object, Object, Object, Object]  4
    0: Object
    1: Object
    2: Object
    3: Object
    length: 4
    __proto__: Array[0]

Violín: http://jsfiddle.net/2kpnV/

¿Porqué es eso?

dan-klasson avatar May 02 '14 20:05 dan-klasson
Aceptado

El examen de objetos console.logse realiza de forma asincrónica. La consola recibe una referencia al objeto de forma sincrónica, pero no muestra las propiedades del objeto hasta que se expande (en algunos casos, dependiendo del navegador y de si tiene herramientas de desarrollo abiertas cuando ocurre el registro). Si el objeto ha sido modificado antes de examinarlo en la consola, los datos mostrados tendrán los valores actualizados.

Por ejemplo, Chrome mostrará un poco ien un cuadro que, al pasar el cursor, dice:

El valor del objeto a la izquierda se tomó una instantánea cuando se registró, el valor a continuación se evaluó hace un momento.

para que sepas lo que estás mirando.

Un truco para iniciar sesión en estos casos es registrar los valores individuales:

console.log(obj.foo, obj.bar, obj.baz);

O codifique JSON la referencia del objeto:

console.log(JSON.stringify(obj));
zzzzBov avatar May 02 '2014 13:05 zzzzBov

Redefinir console.logresolverá el problema.

var originalLog = console.log;
console.log = function(obj) {
    originalLog(JSON.parse(JSON.stringify(obj)));
};
Latpaw avatar Nov 07 '2016 01:11 Latpaw