我有理由相信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/观察到我的意思。
答案 0 :(得分:13)
为什么不直接使用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)将此作为输出:
{"players":{"0":{"color":"green"},"1":{"color":"blue"}},"world":"xyz"}
此外,您的players
对象实际上是一个数组。所以你应该更好地创建它。
<强>更新强>
我刚刚看到你添加了一个JSFIDDLE演示的链接,它在记录之后立即清空players
对象。据我所知,所有Web开发工具都使用某种异步显示,这在使用players
或console.log(obj)
时会产生空console.dir(obj)
个对象。通过使用console.dir(obj)
正确显示对象,Firebug可以提供最佳效果。
答案 1 :(得分:0)
要回答这个问题 - 是的,console.log操作是asynchronous所以不能依赖于在控制台中打印准确的值 - 特别是如果你在console.log之后直接修改打印的对象。打电话(就像你在做的那样)。
如果你拿走这条线:
obj.players = {};
然后普通console.log和JSON.stringify之间的差异消失了。
请记住,在开发人员工具控制台(console.log(obj)中记录实际对象与打印对象的字符串化版本(console.log(JSON.stringify(obj)))之间存在差异。所以对象的表示仍然会有所不同。