2012-06-26 17 views
12

Eventuali duplicati:
Is Chrome's JavaScript console lazy about evaluating arrays?Valore errato nel console.log

Ho le seguenti frammenti di javascript cui uscita mi fa sentire che qualcosa sta andando storto.

1.

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

uscita: 2 4; come previsto

2.

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

uscita: [2,2] [2,2]

Non dovrebbe essere l'uscita[0,2] [2,2]?E qual è la differenza tra i due casi sopra riportati che risultano nelle diverse risposte in entrambi i casi?

+0

Ho ottenuto l'output previsto nell'ultima versione di Chrome. –

+0

Ho ottenuto l'output previsto in firefox. – bjelli

+0

sì, nell'ultima versione di chrome – gopi1410

risposta

14

È perché il registro è in ritardo fino a quando Chrome non ha tempo di farlo (vale a dire che gli script rilasciano la CPU).

Provate a capire cosa succede:

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

Produce ciò che vi aspettate.

È un bug di Chrome? Forse un effetto collaterale di un'ottimizzazione. Almeno è un design pericoloso ...

Perché c'è una differenza? Suppongo che Chrome memorizzi temporaneamente ciò che deve registrare, come valore primario (immutabile) nel primo caso, come puntatore all'array nell'ultimo caso.

+3

sì, molto spesso stanno giocando con il fuoco – Sebas

+0

sì, chrome sembra che stia facendo molti cambiamenti in questi giorni .. grazie btw :) – gopi1410

0

Tutto quello che stai facendo è giusto, ma la registrazione di Chrome è fasulla/ritardata. Prova a creare una copia della variabile e aggiungila e vedrai che il tuo codice è corretto.

5

console.log in chrome/ff è asincrono e gli oggetti registrati vengono interpretati nel momento in cui vengono espansi. . Invece fare una copia dell'oggetto, se si vuole vedere il suo valore in quel momento (per una matrice):

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

Con una serie, chiamando .slice duplicherà la matrice e non creare un riferimento. Non suggerirei di usare un timeout: questo non risolve il problema , lo elude temporaneamente.

0

La registrazione di Chrome è in ritardo nelle versioni più recenti, nessun problema da parte vostra. Crea una copia della variabile o usa setTimeout.

Problemi correlati