stavo aiutando un collega eseguire il debug del codice di oggi e ho notato uno strano comportamento con console.log()
in Google Chrome:Google Chrome console.log() incoerenza con gli oggetti e gli array
Sembra che se:
creare un array nidificato (ad esempio, [[345, "test"]])
registro la matrice per la console con
console.log()
.modificare uno dei valori di matrice interni, quindi
console.log()
stamperà il valore dopo - non fu eseguito i valori della matrice al momento dellaconsole.log()
.
JavaScript:
var test = [[2345235345,"test"]]
console.log(test);
test[0][0] = 1111111;
// outputs: [[1111111,"test"]]
var testb = {};
testb.test = "test";
console.log(testb);
testb.test = "sdfgsdfg";
// outputs: {"testb":"test"}
var testc = ["test","test2"];
console.log(testc);
testc[0] = "sdxfsdf";
// outputs: ["test","test2"]
Questo comportamento non si verifica in Firefox.
Da notare anche che se ho eseguito il suo codice riga per riga nel debugger di Chrome, quindi console.log()
restituirebbe i valori corretti.
C'è una spiegazione per questo strano fenomeno o è solo un bug con Google Chrome?
EDIT:
Ho ridotto i passaggi per riprodurre il comportamento incoerente console.log()
:
Se si aggiunge questo script per la pagina:
var greetings=['hi','bye'];
console.log(greetings);
setTimeout(function(){
greetings.push('goodbye');
},3000);
e apre in una nuova finestra con la finestra della console di Chrome è già aperta, quindi l'output di console.log()
sarà diverso rispetto a quando si carica la pagina con la finestra della console chiusa. Here's a JSFiddle that demonstrates that.
Nel primo caso, con la finestra della console già aperta, console.log()
emetterà il valore corrente dell'array (cioè due elementi).
Nel secondo caso, con la finestra di console inizialmente chiuso e aperto solo dopo al caricamento della pagina, console.log()
stamperà i valori successivi della matrice (cioè tre elementi).
Si tratta di un bug nella funzionalità console.log()
di Google Chrome?
Anche se non so come, esattamente, questo non è un bug, Chrome fa questo genere di cose con una certa frequenza; puoi anche registrare il risultato di una richiesta AJAX; lo riempie retroattivamente, presumibilmente per chiarezza al momento del logging. Sono troppo inesperto per iniziare a spiegare perché, ho appena avuto un problema simile a confondermi.Tuttavia, qualsiasi codice che dipendesse dal valore corretto funzionerebbe correttamente. – Jonline
Sembra che il valore registrato sulla console sia qualcosa di un valore * live *. Qualsiasi valore scalare all'interno degli oggetti di riferimento non verrà calcolato finché non si espanderanno gli oggetti in questione all'interno dell'output della console – Phil
Sembra strano che i risultati di un 'console.log()' siano soggetti a qualcosa come una condizione di competizione. Quando passavo attraverso il codice dei miei colleghi, 'console.log()' restituiva i valori che ci aspettavamo, ma con un'esecuzione normale, emetterebbe un valore modificato successivamente - sembra che tu voglia i valori dell'array a il preciso momento in cui 'console.log()' viene eseguito. –