Comportamiento extraño con objetos y console.log [duplicado]
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?
El examen de objetos console.log
se 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 i
en 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));
Redefinir console.log
resolverá el problema.
var originalLog = console.log;
console.log = function(obj) {
originalLog(JSON.parse(JSON.stringify(obj)));
};