繁体   English   中英

console.log与JSON.stringify不一致

[英]console.log inconsistent with JSON.stringify

我有理由相信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] = ... 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM