Google Chrome-Konsole.log() Inkonsistenz mit Objekten und arrays
Half ich einem Kollegen einige debug-code heute und ich habe ein seltsames Verhalten mit console.log()
in Google Chrome:
Scheint es, dass, wenn Sie:
- Erstellen Sie eine verschachtelte array (z.B. [[345,"test"]])
- Log-array auf der Konsole mit
console.log()
. - Ändern die inneren array-Werte, dann
console.log()
ausgegeben wird später Wert -- nicht die Werte des Arrays zum Zeitpunkt derconsole.log()
ausgeführt wurde.
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 nicht passiert in Firefox.
Auch zu beachten, wenn ich trat durch seinen code Zeile für Zeile in der Chrome-debugger, dann console.log()
würde die Ausgabe der richtigen Werte.
Gibt es eine Erklärung für dieses seltsame Phänomen oder ist es nur ein Fehler mit Google Chrome?
EDIT:
Habe ich eingegrenzt, die Schritte zum reproduzieren des inkonsistente console.log()
Verhalten:
Wenn Sie hinzufügen, um dieses Skript zu Ihrer Seite:
var greetings=['hi','bye'];
console.log(greetings);
setTimeout(function(){
greetings.push('goodbye');
},3000);
und öffnen es in einem neuen Fenster mit der Chrome - Konsole-Fenster bereits geöffnet ist, dann die console.log()
Ausgabe wird anders sein, als wenn Sie das laden der Seite mit der Konsole-Fenster geschlossen. Hier ein JSFiddle, der zeigt, dass.
Im ersten Fall, mit dem console-Fenster bereits geöffnet ist, console.log()
- Ausgabe wird der aktuelle Wert des Arrays (also zwei Elemente).
Im zweiten Fall, mit dem console-Fenster zunächst geschlossen und öffnen nur nach laden der Seite console.log()
ausgegeben wird später die Werte des Arrays (d.h., drei items).
Ist das ein bug in Google Chrome console.log()
Funktionalität?
Es scheint, dass der Wert angemeldet auf der Konsole ist so etwas wie ein live - Wert. Jeder Skalare Wert innerhalb der Referenz-Objekte nicht berechnet werden, bis Sie erweitern Sie die Objekte in Frage, die in der Konsole ausgegeben
Es scheint seltsam, dass die Ergebnisse einer
console.log()
unterliegen würde so etwas wie eine race-Bedingung. Wenn ich trat durch meine Kollegen-code, der console.log()
würde die Ausgabe der Werte, die wir erwarten, aber mit der normalen Ausführung, es würde die Ausgabe einer später geänderten Wert -- scheint, wie würden Sie wollen, dass die Werte des Arrays in dem moment console.log()
ausgeführt wird.es ist kein bug, Chrome absichtlich macht-Konsole.log-Anzeige der live-Wert
möglich, Duplikat der console.log() zeigt den veränderten Wert einer variable, bevor der Wert tatsächlich ändert sich
InformationsquelleAutor Elliot B. | 2014-06-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach viel Graben fand ich, dass dies gemeldet wurde, als einen bug in Webkit behoben, aber offenbar noch nicht gezogen in Google Chrome.
Soweit ich das beurteilen kann, die Frage war ursprünglich hier berichtet: https://bugs.webkit.org/show_bug.cgi?id=35801 :
Antwort von einem Chromium-Entwickler:
Einen fix war umgesetzt zwei und ein halbes Jahr später am 9. August 2012 für Webkit ( http://trac.webkit.org/changeset/125174 ), aber es funktioniert nicht erscheinen, haben es in Chrome noch.
Danke. Ich habe mein Haar ziehen für die letzten paar Tage versucht, herauszufinden, was falsch war mit meinem code. Hier war es ein Problem mit Chrome.
Seinen 2017 und seine immer noch geschieht, mit verschachtelten Objekt-Werte. Ich verbrachte Stunden gestern debugging-encoding plugin, weil es nicht zeigt mir die Werte, stellt sich heraus, es war chrome wenn ich angemeldet obj-Zuordnung und verschachtelte obj vor/nach.
Es ist 2019 und es ist immer noch passiert in meinem Chrome-71. Hmm...
InformationsquelleAutor Elliot B.
Fand ich ein workaround für diesen bug/feature.
Edit: Leider funktioniert es nicht für nicht-primitive Werte wie Funktionen. Verwenden Sie eine Klon-Dienstprogramm hier.
jQuery Beispiel:
toString
FunktionLeider sind nicht alle Objekt werden kann stringified. z.B., die
JSON.stringify(document.body)
InformationsquelleAutor cheeZer