2011-02-14 45 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