2011-11-23 17 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'完全無用於跟蹤。但我想你可以使用傳統的調試器。 –

相關問題