5

可能重複:
Is Chrome's JavaScript console lazy about evaluating arrays?console.log中的錯誤?

我試試下面的代碼:

var myList = new Object(); 
var item = new Object(); 
item.text = "item-1"; 
myList[3] = item; 

console.log(myList); 
console.log(myList[3].text); 

// Assign another object to the same entry 
var item2 = new Object(); 
item2.text = "item-2"; 
myList[3] = item2; 

console.log(myList); 
console.log(myList[3].text); 

結果是很奇怪:

* Object 
    * 3: Object 
     text: "item-2" 

item-1 

* Object 
    * 3: Object 
     text: "item-2" 

item-2 

但是 - 如果我有一段時間(使用的setTimeout)之後執行的第二部分,並展開第一個對象,我得到它的權利,即:

* Object 
    * 3: Object 
     text: "item-1" 

item-1 

* Object 
    * 3: Object 
     text: "item-2" 

item-2 

我覺得很重要的是要分享它,因爲我覺得一個浪費大量時間試圖瞭解他的代碼中的錯誤。 如果有人提到一個開放的bug或什麼的 - 請回復這張票。 謝謝!

+2

的Chrome版本您使用的?在哪個平臺上?我試圖在我的控制檯中運行你的代碼,並得到正確/合理的答案 –

+0

你是怎麼用'setTimeout'調用它的?我也嘗試過,並獲得預期的結果。 – jsalonen

+0

這不是一個錯誤,它是一個功能! Console.log保留對記錄對象的引用,因此您可以在運行時預覽對象。如果您更改了對象的屬性,則自然此更改也會顯示在此實時預覽中。 你可以嘗試瀏覽對象,看看它的「層次」是無限深的,所以不可能緩存它。 – Kasztan

回答

0

對我來說聽起來更像是比其他任何事情都更具競爭性。由於您只傳遞對console.log()的引用,因此它引用的值可能會在實際記錄日期之前更改值。然後,當您使用setTimeout()時,值會在記錄後更改。而不是傳遞參考console.log(),傳遞值的克隆。

0

這是控制檯在某些瀏覽器中登錄的已知問題/功能。

當您記錄某些內容時,它可能不會立即變爲文本格式。如果日誌存儲對您記錄的對象的引用,則它將在日誌中實際顯示時變爲文本格式。

這有一個好處,即在實際打開日誌窗口以顯示日誌之前,日誌記錄對性能影響很小。

即使您在運行代碼時打開了日誌窗口,但在函數運行時沒有更新(因爲Javascript是單線程的),所以控制檯窗口將顯示最終的值的功能,當窗口被更新時。

3

這是一個known bug (50316)因爲人們不採取看看錯誤追蹤報告之前被一次又一次報道:

可悲的是,theres沒有關於如何/何時這將得到解決的信息。直到那一刻,您需要在將對象傳遞給console.log()之前克隆對象。

5

我的觀點是,這是一個可怕的惱人的'功能',我真的希望我可以關閉它,它使調試噩夢,不知道在哪個時間點某物可能更新了一個對象,同時試圖建立確切的對象狀態在代碼中的給定點。該功能可能對「觀察點」等有用,但不適用於所謂的「LOG」(線索在名稱中)。

考慮以下代碼片段:

var person = {'name':'Tom'}; 
console.log(person); //output the entire object variable 
person.name = 'Thomas'; 
//the output is an object, whose 'name' value is 'Thomas', even though the log statement was placed before the value was changed to 'Thomas'. 

然後輸入:

var person = {'name':'Tom'}; 
console.log(person.name); //changed to output a string variable 
person.name = 'Thomas'; 
//the output here, however, has not dynamically updated and correctly outputs 'Tom' 
+1

廢話,我以爲我有一臺量子計算機,可以在更新之前更新值! – FlavorScape

0

我已經做了一些實驗,這個 「問題」 上的Chrome 20.0.1132.57 m.To的最新版本總結關鍵點: -

  • console.log()在執行代碼時用「> Object」打印對象的引用
  • 顯示單擊三角形時的對象狀態,與執行console.log()的代碼行無關
  • 如果要打印處於當前狀態的對象,請打印一個克隆console.log(JSON.parse(JSON.stringify(obj)));

你可以使用這段代碼來測試這對你自己的瀏覽器:

window.onload = function() {chto = {a : 10, b : 20}; 
console.log('Open this object after 5 seconds') 
console.log(chto); 
console.log('Open this object before 5 seconds') 
console.log(chto); 
console.log('Console of the cloned object') 
console.log(JSON.parse(JSON.stringify(chto))); 
setTimeout(function(){ console.log('5 seconds up'); chto['b'] = 30; },5000) ; }; 
相關問題