![](/img/trans.png)
[英]JSON.stringify returning different values then a console.log
[英]console.log inconsistent with JSON.stringify
我有理由相信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] = ...
obj.players = {}; obj.players[0] = ...
码
我的意思的样本可以在http://jsfiddle.net/9dcJP/上观察到。
为什么不直接使用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)
因此,Firebug通过使用console.dir(obj)
正确显示对象来提供最佳结果。
要回答这个问题 - 是的,console.log操作是异步的,所以不能依赖于在控制台中打印准确的值 - 特别是如果你在console.log调用之后直接修改打印对象(就像你正在做的那样)。
如果你带走了这条线:
obj.players = {};
那么普通的console.log和JSON.stringify之间的差异就会消失。
请记住,在开发人员工具控制台(console.log(obj)中记录真实对象与打印对象的字符串化版本(console.log(JSON.stringify(obj)))之间存在差异。所以表示对象仍然会有所不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.