console.melden Sie unvereinbar mit JSON.stringify
Habe ich Grund zu glauben console.log
und JSON.stringify
können inkonsistente sichten auf das gleiche Objekt, auch wenn es erstellt wurde, auf einfache Weise (siehe Anhang).
Situation
In Google Chrome developer tools und Firebug, ich hatte ein Objekt obj
die console.log
ausgedruckt { players: {0: ...}, ...}
, während JSON.stringify
berichtet { players: {}, ...}
. obj.players
war {}
unter beiden Funktionen, so scheint es, dass console.log
ist der Schuldige. Könnte es sein, asynchrone/nicht-deterministisch in irgendeiner Weise?
Zusätzliche Hinweise
Ich fürchte, ich werde nicht in der Lage sein zu viel mehr Kontext, da der code ist langwierig und für einen client, aber ich kann versuchen, ob es etwas gibt, das helfen könnte, den Grund dieser. Für den moment, bin ich gezwungen, zu bleiben Weg von console.log
für die Inspektion.
Könnte es nützlich sein, zu wissen, dass das Objekt gebildet wird, nur aus einem Objekt-literal durch festlegen der Eigenschaften von hand, z.B. obj.players = {}; obj.players[0] = ...
.
Code
Ein Beispiel, was ich meine beobachtet werden können http://jsfiddle.net/9dcJP/.
- Warum nicht einfach
console.log(JSON.stringify(obj));
? - Ohne den code, den Sie kopieren könnte das JSON-Objekt und die beiden Anrufe zu einer jsfiddle zu zeigen, dass es reproduziert in dem einfachsten Fall.
- Sorry,
console.log(JSON.stringify(obj))
war, was ich meinte mitJSON.stringify
. JSON.stringify
sollte der Bericht mit den Tasten, die von Anführungszeichen eingeschlossen, und dieobj.players.0
einen syntax-Fehler. Haben Sie vielleicht einen bestimmten testcase zur Verfügung?- Hoppla, bedeutete
obj.players[0]
. Ich habe eine test-Fall auf jsfiddle jetzt. - möglich, Duplikat der Warum javascript-Objekt, zeigen Sie unterschiedliche Werte in der Konsole in Chrome, Firefox, Safari?
- Ja, danke.
console.log
hat einige asynch Probleme in Chrome, wenn Sie übergeben Sie ein Objekt und ändern Sie dann das Objekt sofort. Sie können es umgehen, reduzieren, was Sie anconsole.log
einen string an, da Zeichenfolgen unveränderlich sind, wird nichts geändert, bevor es ausgegeben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum verwenden Sie nicht nur
console.dir(obj)
statt? Oder verwenden Sieconsole.log(obj)
und dann klicken Sie auf die Ausgabe /erweitern?Auch wenn ich versuche, den folgenden code:
Ich immer (Firefox, Chrome, Opera) bekommen das als Ausgabe:
Ferner es sieht aus wie Ihre
players
- Objekt ist eigentlich ein array. So sollten Sie besser es so.Update:
Ich habe gerade gesehen, dass du noch einen link zu einem JSFIDDLE demo, das leert die
players
Objekt direkt nach dem anmelden. Meines Wissens nach alle web-dev-tools verwenden eine Art der asynchronen Anzeige, die Ergebnisse in eine leereplayers
- Objekt, wennconsole.log(obj)
oderconsole.dir(obj)
. Firebug bietet somit die besten Ergebnisse durch die Anzeige der Objekt ordnungsgemäß mitconsole.dir(obj)
.Um die Frage zu beantworten - ja, Konsole.log-Vorgänge sind asynchrone so kann nicht verlassen werden, um Druck präzise Werte in der Konsole - vor allem, wenn Sie ändern Sie das gedruckte Objekt direkt nach der Konsole.log-Aufruf (wie Sie tun).
Wenn Sie nehmen die Linie:
dann sowohl die Unterschiede zwischen der einfachen Konsole.Protokoll und JSON.stringify dissappear.
Bedenkt, dass es einen Unterschied zwischen der Protokollierung eines realen Objekts in einem Entwickler-tools-Konsole (Konsole.log(obj) und drucken die stringified version des Objekts (Konsole.log(JSON.stringify(obj))). So die Darstellung des Objekts wird immer noch anders sein.