2010-11-16 41 views
10

Duplicar posibles:
Is Chrome's JavaScript console lazy about evaluating arrays?comportamiento console.log extraño en Chrome Developer Tools

Abran Chrome Developer Tools y escriba:

var a = [];console.log(a);a.push(1);console.log(a);

Usted haría esperar que esto produzca algo como

[] 
[1] 

Pero en vez emite

[1] 
[1] 

El comportamiento es el mismo para

var a = [];console.log(a);a[0] = 1;console.log(a);

Puede alguien explicar este comportamiento?

con Chrome en OS X. mismo comportamiento en Windows de 32 bits 7.

EDITAR: El comportamiento es el mismo, independientemente de si los estados están en la misma línea o no. Simplemente los he proporcionado en una sola línea para que sea fácil de probar.

Poner

var a = []; 
console.log(a); 
a.push(1); 
console.log(a); 

en un archivo y luego ejecutarlo produce el mismo comportamiento.

EDITAR x 2 Ver: http://jsfiddle.net/9N4A6/ Si no tiene ganas de hacer un archivo para probar.

+1

Mi suposición es que las llamadas a 'consola. log (a) 'pone en cola el objeto de la matriz para imprimir, pero que la conversión de la matriz a cadena ocurre solo después de que se completa la línea. – Pointy

+0

@CMS: No vi eso - gracias –

+0

De nada @Jamie :) – CMS

Respuesta

4

Tal vez puedas probar:

var a = []; console.log(a.toString()); a.push(1); console.log(a.toString()); 

No es que el orden de evaluación es extraño, apuesto, pero que la conversión de los objetos a forma imprimible sucede después de las declaraciones están ejecutados, en el momento en Chrome está listo para realmente descargar el registro.

+0

Bueno, 'var a = []; console.log (a [0]); a [0] = 1; console.log (a [0]); ' funciona como se esperaba, por lo que a veces console.log no ejecuta todas las instrucciones antes de imprimir. –

+1

@maarons, en realidad eso se espera incluso si la impresión se retrasa ... envía el valor 1 a console.log(), que es lo que se almacena en caché y luego se muestra. – rob

3

Mismo comportamiento aquí con Win7 en una máquina x64. Supongo que el método de registro contiene una referencia al a y pone en cola las llamadas que están en una sola línea.

EDIT No es un problema de Chrome/ium solo, he sido testigo de lo mismo con Firebug. Como dije, el registro de la consola debe ponerse en cola de alguna manera.

+0

El mismo comportamiento ocurre cuando no están en una sola línea. Lo hice en una sola línea para que sea más fácil pegar y probar. –

+0

No, no puedo confirmar el problema cuando uso varias declaraciones. Funciona como se supone que es. Debo agregar que estoy usando compilaciones de Chromium. – aefxx

+0

Abra la consola aquí: http://jsfiddle.net/9N4A6/ –

1

Sí, también lo hace en objetos ... y si cambia el valor más tarde (por ejemplo, muchos segundos más tarde) y luego expande el objeto en la consola, el nuevo valor estará ahí. Es extraño, pero puede ser útil en cierto sentido.

Si quiere el valor actual, simplemente diga "console.log (a.toString());" o similar.

2

Al menos con matrices, puede clonar la matriz para cada registro de llamadas:

var a = [];console.log([].concat(a));a.push(1);console.log([].concat(a)); 

Para los objetos, recomiendo JSON:

var a = {};console.log(JSON.stringify(a));a[0]=1;console.log(JSON.stringify(a)); 
2

Lo que se está "conectado" es el objeto "a "... no la representación de texto simple de" a ". La pantalla de registro es lo suficientemente inteligente como para mostrar un marcador de posición para el objeto "a", que se llena/completa "más adelante" (parece que se encuentra al final de la invocación del evento). Si usted se pega un estado de alerta() en verá los valores esperados (valores registrados se "rellenado"):

var a = []; 
console.log(a); 
alert('force console to display correctly'); 
a.push(1); 
console.log(a); 

Este parece ser un error en Chrome para mí (un poco torpe a tener que poner una declaración de alerta para ver la información de registro correcta).

(tenga en cuenta esta cuestión mostraron en la parte superior de una búsqueda en Google de "cromo console.log sólo muestra los valores actuales", así que pensé que me gustaría añadir mi respuesta)

+0

No es un problema de Chrome, es un problema de Webkit. El mismo error sucederá en Safari. –

Cuestiones relacionadas