【发布时间】:2012-01-05 03:43:21
【问题描述】:
可能重复:
Is Chrome's JavaScript console lazy about evaluating arrays?
考虑这个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 的一个基本方面?
【问题讨论】:
-
如果我不得不猜测,我会说调试器正在内存中存储第一个对象的引用,以及第二个对象的值本身。由于您的代码更新了引用,因此正在监视的调试器中的值也会更新。不过完全是疯狂的猜测。
-
最好的猜测是 Safari 和 Chrome 正在优化 JavaScript 并将对 foo.bar 的赋值与原始对象定义相结合,然后在两个 console.log 语句中内联 foo.bar 的预期值.
-
感谢迈克和约翰。看来情况确实如此,不是吗。我不得不说,在我看来,这意味着 Safari 和 Chrome 在我尝试调试时对我的代码撒谎!如果我想在执行期间快速查看对象在代码中的两个点包含什么,那么 Safari 和 Chrome 并没有给我一个真实的表示。也许我的调试程序不够复杂,我不应该依赖代码中的手动 console.log 行?
-
这个以前出现过,我去找找。
-
@OskarSmith 我怀疑您提供的示例也太琐碎,无法真正测试行为。我怀疑优化正在完成,因为在创建和重新分配
foo.bar之间没有对对象进行“工作”。如果有一些工作,比如方法调用,我怀疑你会得到你正在寻找的行为。
标签: javascript