具有变异状态的JavaScript日志记录对象

时间:2011-02-14 14:13:23

标签: javascript debugging console

此JavaScript代码......

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

...导致两次显示相同的交互式树输出:
Two objects with foo:"bar" shown
此问题作为错误here on Stack Overflow进行了讨论,记录为Chromium bugWebKit(我想象其他地方)。

我理解这种情况的实现原因,但它使得调试有状态对象变得困难(不使用交互式调试器)。您使用什么策略来记录这种情况,您需要在每个日志调用中查看对象的不同状态? JSON.stringify()?是否有可以使用的序列化控制台方法?

1 个答案:

答案 0 :(得分: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));