2011-02-14 44 views
4

這段JavaScript代碼JavaScript的日誌對象...與變異狀態

var o = {}; 
console.dir(o); 
o.foo = "bar"; 
console.dir(o); 

...產生相同的互動樹輸出兩次:
Two objects with foo:"bar" shown
這個問題作爲一個bug here on Stack Overflow討論,記錄作爲Chromium bugWebKit(我想其他地方)。

我明白這種情況的實現原因,但它使得調試有狀態對象變得困難(不使用交互式調試器)。你使用什麼策略來登錄這種情況,你需要在每次日誌調用中看到對象的不同狀態? JSON.stringify()?有沒有可用於序列化的控制檯方法?

回答

2

我會解決這個問題,通過對你正在記錄的內容進行「深層複製」,並將副本傳遞給console.dir()。像這樣的東西效果很好:

function deep_copy(ref) 
{ 
    var r; 
    var i; 

    if(isHash(ref)) 
    { 
     r = {}; 
     for(i in ref) 
       r[i] = deep_copy(ref[i]); 
    } 
    else if(isArray(ref)) 
    { 
     r = []; 
     for(i = 0; i < ref.length; i++) 
      r[i] = deep_copy(ref[i]); 
    } 
    else 
    { 
     r = ref; 
    } 

    return r; 
} 

如果你不想這樣的事情打擾,然後使用JSON.stringify是一個偉大的解決辦法,如果它在瀏覽器的本地不會慢得多。

console.dir(JSON.parse(JSON.stringify(o)); 
+0

+1的想法,但你錯過了一些代碼(isHash`和`isArray`的`定義),這將不會對屬性的作用加入到現有的對象(例如一個函數或正則表達式)或數組上的自定義屬性。但是,我沒有考慮使用stringify/parse來複制對象,同時保留樹視圖。好一個。 – Phrogz 2011-02-14 16:29:02