Ich half einem Kollegen heute einige Code debuggen und ich bemerkte ein seltsames Verhalten mit console.log()
in Google Chrome:Google Chrome console.log() Inkonsistenz mit Objekten und Arrays
Es scheint, dass, wenn Sie:
erstellen einer verschachtelten Array (zB [[345, "test"]])
Log das Array an der Konsole mit
console.log()
.Ändern eines der inneren Datenfeldwerte, dann
console.log()
ausgeben wird der spätere Wert - nicht die Werte des Arrays zu der Zeit derconsole.log()
wurde ausgeführt.
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"]
Dieses Verhalten tritt nicht in Firefox.
Auch, wenn ich im Code Debugger Zeile für Zeile durch seinen Code trat, dann würde console.log()
die richtigen Werte ausgeben.
Gibt es eine Erklärung für dieses seltsame Phänomen oder ist es nur ein Bug mit Google Chrome?
EDIT:
Ich habe die Schritte verengt, um die inkonsistenten console.log()
Verhalten zu reproduzieren:
Wenn Sie dieses Skript zu Ihrer Seite hinzufügen:
var greetings=['hi','bye'];
console.log(greetings);
setTimeout(function(){
greetings.push('goodbye');
},3000);
und öffnen Sie sie in Ein neues Fenster mit dem bereits geöffneten Konsolenfenster , dann ist die Ausgabe console.log()
anders als beim Laden der Seite mit dem Konsolenfenster geschlossen. Here's a JSFiddle that demonstrates that.
Im ersten Fall, bei bereits geöffnetem Konsolenfenster, gibt console.log()
den aktuellen Wert des Arrays (d. H. Zwei Elemente) aus.
Im zweiten Fall, mit dem Fenster Konsole zunächst geschlossen und erst nach Laden der Seite geöffnet, console.log()
ausgeben wird die späteren Werte des Arrays (d.h. drei Artikel).
Ist dies ein Fehler in Google Chrome console.log()
Funktionalität?
Obwohl ich weiß nicht, wie genau dies ist kein Fehler, tut Chrome diese Art der Sache mit einer gewissen Häufigkeit; Sie können auch das Ergebnis einer AJAX-Anfrage protokollieren; Es füllt es rückwirkend aus, vermutlich zur besseren Übersichtlichkeit beim Logging. Ich bin zu unerfahren, um zu erklären, warum, ich hatte gerade ein ähnliches Problem, mich zu verwirren.Jeglicher Code, der von dem korrekten Wert abhing, würde jedoch gut funktionieren. – Jonline
Es scheint, dass der in der Konsole protokollierte Wert etwas von einem * live * -Wert ist. Jeder Skalarwert innerhalb von Referenzobjekten wird nicht berechnet, bis Sie die betreffenden Objekte in der Konsolenausgabe expandieren. – Phil
Es erscheint seltsam, dass die Ergebnisse einer 'console.log()' einer race-Bedingung unterliegen. Wenn ich meinen Kollegen-Code durchging, würde die 'console.log()' die von uns erwarteten Werte ausgeben, aber bei normaler Ausführung würde sie einen späteren modifizierten Wert ausgeben - scheint so, als würden Sie die Werte des Arrays bei wollen der genaue Moment, in dem 'console.log()' ausgeführt wird. –