2012-06-26 25 views
12

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

tengo los siguientes fragmentos en JavaScript cuya salida me hace sentir que algo va mal.

1.

a=2; 
console.log(a); 
a+=2; 
console.log(a); 

de salida: 2 4; como se esperaba

2.

t=[0,2]; 
console.log(t); 
t[0]+=2; 
console.log(t); 

de salida: [2,2] [2,2]

no debe ser la salida[0,2] [2,2]?¿Y cuál es la diferencia entre los dos casos anteriores que resulta en las diferentes respuestas en ambos casos?

+0

Obtuve el resultado esperado en la última versión de Chrome. –

+0

Obtuve el resultado esperado en Firefox. – bjelli

+0

sí, en la última versión de cromo – gopi1410

Respuesta

14

Esto se debe a que el registro se retrasa hasta que Chrome tiene tiempo para hacerlo (es decir, las secuencias de comandos liberan la CPU).

Pruebe lo siguiente para entender lo que sucede:

var t=[0,2]; 
console.log(t); 
setTimeout(function() { 
    t[0]+=2; 
    console.log(t); 
}, 1000); 

Se da salida a lo que espera.

¿Eso es un error de Chrome? Tal vez un efecto secundario de una optimización. Al menos es un diseño peligroso ...

¿Por qué hay una diferencia? Supongo que Chrome almacena temporalmente lo que debe registrar, como un valor primario (inmutable) en el primer caso, como un puntero a la matriz en el último caso.

+3

Sí, muy a menudo están jugando con fuego – Sebas

+0

sí, Chrome parece estar haciendo un montón de cambios en estos días ... gracias por cierto :) – gopi1410

0

Todo lo que está haciendo es correcto, pero el registro de Chrome es confuso/demorado. Intenta hacer una copia de la variable y añádela a eso, y verás que tu código es correcto.

5

console.log en chrome/ff es asíncrono y los objetos que se registran se interpretan en el momento en que se expanden. . En lugar de hacer una copia del objeto, si desea ver su valor en ese momento (por una matriz):

t=[0,2]; 
console.log(t.slice(0)); 
t[0]+=2; 
console.log(t); 

Con una matriz, llamando .slice duplicará la matriz y no crear una referencia. No recomendaría usar un tiempo de espera: esto realmente no resuelve el problema, solo lo evita temporalmente.

0

El registro de Chrome se retrasa en las versiones más nuevas, no hay problema por su parte. Haga una copia de la variable o use setTimeout.