Duplicar posible:
Is Chrome's JavaScript console lazy about evaluating arrays?¿Por qué el objeto javascript muestra valores diferentes en la consola en Chrome, Firefox, Safari?
consideran este javascript:
var foo = {bar : 1111};
console.log(foo);
console.log(foo.bar);
foo.bar = 2222;
console.log(foo);
console.log(foo.bar);
En Firebug de Firefox, esto demuestra lo que yo hubiera esperado:
Object { bar=1111}
1111
Object { bar=2222}
2222
Sin embargo, en la consola de Safari y Chrome se muestra:
Object { bar=2222}
1111
Object { bar=2222}
2222
En otras palabras, el objeto está mostrando los atributos incorrectos en la consola cuando si se imprime un atributo específico de impresión son objeto de dumping, pero el valor correcto.
¿Es esto una peculiaridad de los navegadores? ¿O un aspecto fundamental del javascript orientado a objetos que me falta?
Si tuviera que adivinar, diría que el depurador está almacenando una referencia al objeto en la memoria para el primero, y el valor propio para el segundo. Como el código actualiza la referencia, el valor del depurador que se está viendo también se actualiza. Total de conjeturas salvajes sin embargo. –
La mejor suposición sería que Safari y Chrome están optimizando el JavaScript y combinando la asignación a foo.bar con la definición del objeto original, y luego haciendo hincapié en el valor esperado de foo.bar en las dos instrucciones de console.log. –
Gracias Mike y John. Parece que este es el caso, ¿no? Tengo que decir que, en mi opinión, esto significa que Safari y Chrome me están diciendo mentiras sobre mi código mientras estoy tratando de depurarlo. Si quiero ver rápidamente qué contiene un objeto en dos puntos del código durante la ejecución, entonces Safari y Chrome no me dan una verdadera representación. ¿Quizás mi rutina de depuración no es lo suficientemente sofisticada y no debería confiar en las líneas de console.log del código? –