为什么 javascript 对象在 Chrome、Firefox、Safari 的控制台中显示不同的值?

IT技术 javascript
2021-02-07 00:50:30

可能的重复:
Chrome 的 JavaScript 控制台是否懒得评估数组?

考虑这个javascript:

var foo = {bar : 1111};
console.log(foo);
console.log(foo.bar);

foo.bar = 2222;
console.log(foo);
console.log(foo.bar);

在 Firefox 的萤火虫中,这显示了我的预期:

Object { bar=1111}
1111

Object { bar=2222}
2222

但是,在 Safari 和 Chrome 的控制台中,它显示:

Object { bar=2222}
1111

Object { bar=2222}
2222

换句话说,对象在打印转储时在控制台中显示错误的属性,但如果打印特定属性则显示正确的值。

这是浏览器的怪癖吗?或者我缺少的面向对象 javascript 的一个基本方面?

1个回答

在 Chrome(WebKit,Safari 也是如此)中,console.log带有对象参数的调用会记录一个对象引用。单击并打开对象选项卡后,内部结构保持不变(大概是某种缓存)并且不再与最初引用的对象相关(因此,如果在稍后阶段对象发生更改,则不会反映出来)。然而,在那之前,对象仍然是“未缓存的”。因此,当您多次记录一个对象然后打开每个记录的对象时,它们都指向内存中的同一个对象,其值是最新更新的对象。

这是一个众所周知的“问题”,尽管该行为是设计决策的结果(请参阅第一个链接上的评论),因此开发团队并未将其视为错误。

简单的解决方法是获取对象的非对象值的任何方法,因此任何序列化方法(例如console.log(JSON.stringify(foo));)。

https://bugs.webkit.org/show_bug.cgi?id=35801
http://code.google.com/p/chromium/issues/detail?id=44720
http://code.google.com/p/铬/问题/细节?id=50316

是的,我不得不同意它有点蹩脚......它对console.log追踪完全没用。但我想你可以使用传统的调试器来处理这些事情。
2021-03-12 00:50:30
console.log(JSON.stringify(foo)); 调试应该没问题。
2021-03-23 00:50:30
谢谢。猜猜我不使用 Firebug 是正确的!
2021-03-25 00:50:30
2021-04-02 00:50:30
我收回这个。调用没有延迟,日志机制是基于引用的,但调用看起来完全同步。
2021-04-03 00:50:30