console.log与JSON.stringify不一致

时间:2012-01-04 20:50:11

标签: javascript firebug google-chrome-devtools

我有理由相信console.logJSON.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 个答案:

答案 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开发工具都使用某种异步显示,这在使用playersconsole.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)))之间存在差异。所以对象的表示仍然会有所不同。