2011-11-23 12 views
11

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?

+2

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. –

+2

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. –

+1

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? –

Respuesta

21

En Chrome (WebKit, también Safari), console.log llamadas con argumentos de objeto, registra una referencia de objeto. Una vez que se hace clic y se abre la pestaña del objeto, las partes internas permanecen constantes (presumiblemente una especie de caché) y ya no están relacionadas con el objeto al que se hace referencia inicialmente (de modo que si en un momento posterior el objeto cambia, esto no se reflejará). Sin embargo, hasta ese punto, el objeto permanece "sin cache". Por lo tanto, cuando registra un objeto varias veces y luego abre cada objeto registrado, todos apuntan al mismo objeto en la memoria, cuyo valor es el más actualizado.

Es un "problema" bien conocido, aunque el comportamiento es el resultado de una decisión de diseño (ver comentarios en el primer enlace), por lo que el equipo de desarrollo no lo considera un error.

Las soluciones alternativas fáciles son cualquier medio para obtener un valor no objeto del objeto, por lo que cualquier método de serialización (por ejemplo, console.log(JSON.stringify(foo));).

https://bugs.webkit.org/show_bug.cgi?id=35801
http://code.google.com/p/chromium/issues/detail?id=44720
http://code.google.com/p/chromium/issues/detail?id=50316

+0

El error de webkit: https://bugs.webkit.org/show_bug.cgi?id=35801 –

+0

Gracias. ¡Adivina que me sirve para no usar Firebug! –

+0

Sí, tendría que aceptar que es un poco tonto ... Hace 'console.log' totalmente inútil para el rastreo. Pero supongo que podrías usar un depurador tradicional para esas cosas. –

Cuestiones relacionadas