5

Duplicar posible:
Is Chrome's JavaScript console lazy about evaluating arrays?Error en console.log?

trato el siguiente código:

var myList = new Object(); 
var item = new Object(); 
item.text = "item-1"; 
myList[3] = item; 

console.log(myList); 
console.log(myList[3].text); 

// Assign another object to the same entry 
var item2 = new Object(); 
item2.text = "item-2"; 
myList[3] = item2; 

console.log(myList); 
console.log(myList[3].text); 

El resultado es bastante extraño:

* Object 
    * 3: Object 
     text: "item-2" 

item-1 

* Object 
    * 3: Object 
     text: "item-2" 

item-2 

PERO - si ejecuto la segunda parte después de algún tiempo (usando setTimeout), y despliegue el primer objeto, que hacerlo bien, es decir:

* Object 
    * 3: Object 
     text: "item-1" 

item-1 

* Object 
    * 3: Object 
     text: "item-2" 

item-2 

me parece importante compartir, ya que creo que se puede perder mucho tiempo tratando de entender lo que está mal en su código. Y si alguien tiene alguna referencia a un error abierto o algo así, responda este ticket. Gracias!

+2

¿Qué versión de cromo se utiliza? ¿En qué plataforma? Intenté ejecutar el código en mi consola y obtuve la respuesta correcta/lógica –

+0

¿Cómo se llama exactamente con 'setTimeout'? Lo intenté también y obtuve los resultados esperados. – jsalonen

+0

¡No es un error, es una característica! Console.log mantiene la referencia al objeto registrado, por lo que puede obtener una vista previa del objeto en tiempo de ejecución. Si ha cambiado el atributo del objeto, de forma natural este cambio también se muestra en esta vista previa en tiempo real. Puede probar el objeto de exploración para ver que su "jerarquía" es infinitamente profunda, por lo que es imposible almacenarla en caché. – Kasztan

Respuesta

0

Me parece más una condición de carrera que otra cosa. Como solo está pasando una referencia al console.log(), el valor al que se refiere probablemente haya cambiado de valor cuando se registra realmente. Luego, cuando use setTimeout(), el valor cambia después de que se haya registrado. En lugar de pasar una referencia a console.log(), pase un clon del valor.

0

Este es un problema/función conocida con el registro de la consola en algunos navegadores.

Cuando registra algo, es posible que no se convierta inmediatamente en formato de texto. Si el registro almacena una referencia al objeto que usted registra, se convertirá en formato de texto cuando en realidad se muestre en el registro.

Esto tiene la ventaja de que registrar algo tiene un impacto muy pequeño en el rendimiento, hasta que realmente se abre la ventana de registro para mostrar el registro.

Incluso si tiene la ventana de registro abierta mientras ejecuta el código, no hay actualizaciones mientras su función se está ejecutando (ya que Javascript tiene un solo subproceso), por lo que la ventana de consola mostrará los valores tal como están al final de la función, cuando la ventana se actualiza.

3

esta es una known bug (50316) eso se difundió una y otra vez porque la gente no miren bugtracker antes de informar:

tristemente, theres ninguna información sobre si/cuando esto se resuelven. hasta ese momento, necesitarás clonar objetos antes de pasarlos al console.log().

5

Mi punto de vista es que esta es una 'característica' tremendamente irritante que realmente me gustaría apagar, hace que la depuración sea una pesadilla, sin saber en qué momento algo puede haber actualizado un objeto, tratando de establecer estado del objeto en un punto de dar en el código. La función podría ser útil para 'vigilar puntos', etc., pero no en algo llamado 'LOG' (la pista está en el nombre).

consideran este fragmento de código:

var person = {'name':'Tom'}; 
console.log(person); //output the entire object variable 
person.name = 'Thomas'; 
//the output is an object, whose 'name' value is 'Thomas', even though the log statement was placed before the value was changed to 'Thomas'. 

Y DESPUÉS:

var person = {'name':'Tom'}; 
console.log(person.name); //changed to output a string variable 
person.name = 'Thomas'; 
//the output here, however, has not dynamically updated and correctly outputs 'Tom' 
+1

basura, ¡y pensé que tenía una computadora cuántica que podría actualizar los valores antes de que se actualizaran! – FlavorScape

0

He hecho algunos experimentos con este "problema" en la última versión de Chrome 20.0.1132.57 m.To resumir la puntos clave: -

  • console.log() imprime una referencia al objeto con "> Objeto" cuando se ejecuta el código
  • Aparece el estado del objeto al hacer clic en el triángulo, independientemente de la línea de código donde se ejecuta console.log()
  • Si desea imprimir el objeto en su estado actual, imprima un clon console.log(JSON.parse(JSON.stringify(obj)));

se puede usar este bit de código para probar esto en su propio navegador:

window.onload = function() {chto = {a : 10, b : 20}; 
console.log('Open this object after 5 seconds') 
console.log(chto); 
console.log('Open this object before 5 seconds') 
console.log(chto); 
console.log('Console of the cloned object') 
console.log(JSON.parse(JSON.stringify(chto))); 
setTimeout(function(){ console.log('5 seconds up'); chto['b'] = 30; },5000) ; };