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

可能重复:
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 

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

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

在Chrome(WebKit,所以Safari也), console.log调用与对象参数日志对象引用。 一旦对象标签被点击并打开,内部保持不变(大概是一个cachingsorting),并不再与最初引用的对象有关(所以如果在稍后阶段对象发生变化,这将不会被反映出来)。 但是直到那一刻,对象仍然是“未caching的”。 所以,当你logging一个对象多次,然后打开每个logging的对象,它们都指向内存中的相同的对象,其值是最新的更新的对象。

这是一个众所周知的“问题”,虽然这个行为是devise决定的结果(见第一个链接的评论),所以不被认为是开发团队的错误。

简单的解决方法是获取对象的非对象值的任何方法,所以任何序列化方法(例如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