console.log не согласуется с JSON.stringify - PullRequest
9 голосов
/ 05 января 2012

У меня есть основания полагать, что console.log и JSON.stringify могут создавать несовместимые виды одного и того же объекта, даже если он был создан простым способом (см. Примечания).

Ситуация

В инструментах разработчика Google Chrome и Firebug у меня был объект obj, который console.log распечатывался как { players: {0: ...}, ...}, тогда как JSON.stringify сообщал { players: {}, ...}.obj.players был {} под обеими функциями, поэтому кажется, что console.log является виновником.Может ли это быть каким-то образом асинхронным / недетерминированным?

Дополнительные примечания

Боюсь, я не смогу предоставить гораздо больше контекста, так каккод длинный и для клиента, но я могу попробовать, если есть что-то, что могло бы помочь разобраться в этом.На данный момент я вынужден держаться подальше от console.log для проверки.

Может быть полезно знать, что объект формируется просто из литерала объекта путем установки свойств вручную, например, obj.players = {}; obj.players[0] = ....

Код

Образец того, что я имею в виду, можно наблюдать при http://jsfiddle.net/9dcJP/.

Ответы [ 2 ]

13 голосов
/ 27 июня 2012

Почему бы вам просто не использовать console.dir(obj) вместо этого?Или используйте console.log(obj) и затем нажмите на вывод / разверните его?

Также, когда я пытаюсь следующий код:

var obj = {};
obj.players = {};
obj.players[0] = {color: "green"};
obj.players[1] = {color: "blue"};
obj.world = "xyz";
console.log(JSON.stringify(obj));

Я всегда (Firefox, Chrome, Opera) получаю это какoutput:

{"players":{"0":{"color":"green"},"1":{"color":"blue"}},"world":"xyz"}

Более того, похоже, что ваш players объект на самом деле является массивом.Поэтому вам лучше создать его таким образом.

Обновление: Я только что увидел, что вы добавили ссылку на демонстрационную версию JSFIDDLE, которая очищает объект players сразу после его регистрации.Насколько мне известно, все инструменты веб-разработки используют какой-то асинхронный дисплей, что приводит к пустому объекту players при использовании console.log(obj) или console.dir(obj).Таким образом, Firebug предлагает лучшие результаты, правильно отображая объект с помощью console.dir(obj).

0 голосов
/ 23 декабря 2015

Чтобы ответить на вопрос - да, операции console.log асинхронны , поэтому на них нельзя положиться, чтобы печатать точные значения в консоли - особенно если вы изменяете печатный объект сразу после console.log звоните (как вы делаете).

Если убрать строку:

obj.players = {};

тогда исчезнут различия между простым console.log и JSON.stringify.

Имея в виду, что существует разница между регистрацией реального объекта в консоли инструментов разработчика (console.log (obj) и печатью строковой версии объекта (console.log (JSON.stringify (obj))). Таким образом, представление объекта все равно будет другим.

...