2011-11-23 63 views
11

可能重复:
Is Chrome's JavaScript console lazy about evaluating arrays?为什么javascript对象在Chrome,Firefox,Safari的控制台中显示不同的值?

考虑此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和铬的控制台它表明:

Object { bar=2222} 
1111 

Object { bar=2222} 
2222 

换句话说,对象被示出,如果打印的打印倾倒,但正确的值的特定属性,当在控制台中错误的属性。

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

+2

如果我猜,我说的调试器存储用于第一个存储器中的对象的引用,而对于第二个中的值本身。由于您的代码更新了引用,因此正在监视的调试器中的值也会更新。尽管总猜测。 –

+2

最好的猜测是Safari和Chrome正在优化JavaScript,并将赋值与foo.bar与原始对象定义相结合,然后在两个console.log语句中嵌入foo.bar的期望值。 –

+1

感谢迈克和约翰。它确实表明,情况并非如此。 我不得不说,在我眼里这意味着Safari和Chrome在我试图调试时告诉我有关我的代码的谎言!如果我想在执行过程中快速查看代码中两个点包含的内容,那么Safari和Chrome并没有给我一个真实的表示。 也许我的调试程序不够复杂,我不应该依赖代码中的手动console.log行? –

回答

21

在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/chromium/issues/detail?id=50316

+0

webkit bug:https://bugs.webkit.org/show_bug.cgi?id = 35801 –

+0

谢谢。猜猜它适合我不使用Firebug! –

+0

是的,我必须同意它有点蹩脚..它使'console.log'完全无用于跟踪。但我想你可以使用传统的调试器。 –

相关问题