【问题标题】:JavaScript logging object with mutating state [duplicate]具有变异状态的 JavaScript 日志记录对象 [重复]
【发布时间】:2011-06-26 23:04:02
【问题描述】:

这段 JavaScript 代码...

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

...导致相同的交互式树输出显示两次:

这个问题被讨论为一个错误here on Stack Overflow,记录为Chromium bugWebKit(我想象其他地方)。

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

【问题讨论】:

    标签: javascript debugging console


    【解决方案1】:

    我会通过制作您正在记录的内容的“深层副本”并将副本传递给 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));
    

    【讨论】:

    • +1 的想法,虽然你错过了一些代码(isHashisArray 的定义),这不适用于添加到现有对象的属性(例如函数或正则表达式)或数组上的自定义属性。但是,我没有考虑在保留树视图的同时使用 stringify/parse 来复制对象。不错。
    • 使用stringify 的一个问题是它无法处理循环引用。
    • 没错,@Phrogz,虽然 JSON.stringify() 至少会崩溃,而我上面的代码将无限循环! (哦不!)=)
    • 关于 stringify 的循环引用问题。有些库声称可以解决该问题。例如:circular-json、json-stringify-safe 等
    猜你喜欢
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    相关资源
    最近更新 更多