console.log ist inkonsistent mit JSON.stringify

8

Ich habe Grund zu der Annahme, dass console.log und JSON.stringify inkonsistente Ansichten desselben Objekts erzeugen können, selbst wenn es auf einfache Weise erstellt wurde (siehe Anmerkungen).

Situation

Sowohl in den Google Chrome-Entwicklertools als auch in Firebug hatte ich ein Objekt obj , das console.log als { players: {0: ...}, ...} ausgab, während JSON.stringify als { players: {}, ...} angezeigt wurde. obj.players war {} unter beiden Funktionen, es scheint also, dass console.log der Täter ist. Könnte es in irgendeiner Weise asynchron / nicht-deterministisch sein?

Zusätzliche Hinweise

Ich fürchte, ich werde nicht viel mehr Kontext bereitstellen können, da der Code langwierig ist und für einen Kunden, aber ich kann versuchen, wenn es etwas gibt, das helfen könnte, dies zu verstehen. Im Moment bin ich gezwungen, mich von console.log zur Inspektion fernzuhalten.

Es kann nützlich sein, zu wissen, dass das Objekt nur aus einem Objektliteral gebildet wird, indem Eigenschaften manuell festgelegt werden, z. B. obj.players = {}; obj.players[0] = ... .

Code

Ein Beispiel dessen, was ich meine, kann man bei Ссылка sehen.

    
Peteris 04.01.2012, 20:50
quelle

2 Antworten

11

Warum benutzen Sie nicht einfach console.dir(obj) ? Oder benutzen Sie console.log(obj) und klicken Sie dann auf die Ausgabe / erweitern?

Auch wenn ich den folgenden Code versuche:

%Vor%

Ich habe das immer (Firefox, Chrome, Opera) als Ausgabe bekommen:

%Vor%

Außerdem sieht es so aus, als wäre Ihr Objekt players eigentlich ein Array. Also solltest du es besser so machen.

Aktualisierung: Ich habe gerade gesehen, dass Sie einen Link zu einer JSFIDDLE-Demo hinzugefügt haben, die das players -Objekt direkt nach der Protokollierung leert. Nach meinem Wissen verwenden alle Web-Dev-Tools eine Art von asynchroner Anzeige, die bei Verwendung von players oder console.log(obj) zu einem leeren console.dir(obj) -Objekt führt. Firebug bietet dabei die besten Ergebnisse, indem das Objekt korrekt mit console.dir(obj) angezeigt wird.

    
Sebastian Zartner 27.06.2012, 05:30
quelle
0

Um die Frage zu beantworten - ja, sind die console.log-Operationen asynchron , sodass nicht darauf vertraut werden kann, dass sie gedruckt werden genaue Werte in der Konsole - vor allem, wenn Sie das gedruckte Objekt direkt nach dem Aufruf von console.log ändern (wie Sie es gerade tun).

Wenn Sie die Zeile wegnehmen:

%Vor%

dann verschwinden die Unterschiede zwischen der einfachen console.log und der JSON.stringify.

Beachten Sie, dass es einen Unterschied zwischen dem Protokollieren eines realen Objekts in einer Konsole für Entwicklerwerkzeuge (console.log (obj) und dem Drucken der stringifizierten Version des Objekts (console.log (JSON.stringify (obj)) gibt). Die Darstellung des Objekts wird also immer noch anders sein.

    
jsdeveloper 23.12.2015 02:24
quelle