对象转储JavaScript


89

是否有第三方插件/应用程序或某种方法可以在脚本调试器中为JavaScript对象执行对象映射转储?

这是一种情况...我有两次被调用的方法,每次都不同。我不确定有什么不同,但是有什么不同。因此,如果我可以将window(或至少window.document)的所有属性转储到文本编辑器中,则可以使用简单的文件diff比较两个调用之间的状态。有什么想法吗?


Answers:


61

萤火虫 +console.log(myObjectInstance)


4
...然后查看Firebug控制台,而不是标准Javascript控制台。:-)
towi 2012年

3
IE有一个控制台,但是记录一个对象会返回[object Object]。不太有用
Steve Robbins 2012年

5
@SteveRobbins,如今谁使用IE开发Web应用程序?就个人而言,到目前为止,我发现Internet Explorer的唯一用途是在重新安装Windows操作系统后下载真正的Web浏览器。顺便说一句,这是我唯一一次启动这种安全的软件。
Darin Dimitrov

8
任何支持主要浏览器的开发人员。如果问题仅在IE中存在,则只能在IE中进行测试,因此您必须使用浏览器。
史蒂夫·罗宾斯

2
并且,如果您使用的是node.js和终端。。没有萤火虫?
Cheruvim 2014年

134
console.log("my object: %o", myObj)

否则,您最终将得到有时显示的字符串表示形式:

[object Object]

或类似的东西。


3
只需为Chrome和Firefox打印[object Object]。<耸肩>
slashdottir 2014年

1
@slashdottir它绝对适用于Chrome和FF。我至少每周一次在Chrome中使用它,偶尔在FF中使用它。
2014年

1
@Tim:您是对的,它有效。请原谅我。用户犯错
slashdottir

这到底是不是所选答案?幸运的是,这是我四年前在不使用js的生日上回答的。
乔伊·卡森

2
在Meteor(服务器端)中,它打印my object: %o。不太有用:)
Erdal G.

45
function mydump(arr,level) {
    var dumped_text = "";
    if(!level) level = 0;

    var level_padding = "";
    for(var j=0;j<level+1;j++) level_padding += "    ";

    if(typeof(arr) == 'object') {  
        for(var item in arr) {
            var value = arr[item];

            if(typeof(value) == 'object') { 
                dumped_text += level_padding + "'" + item + "' ...\n";
                dumped_text += mydump(value,level+1);
            } else {
                dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
            }
        }
    } else { 
        dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
    }
    return dumped_text;
}

4
通过更改函数名称来更新代码,如在递归调用中一样,它在定义其“ mydump”时间的同时被称为“ dump”
Vikas


1
当检查一个jquery对象时,这会以“太多的递归”杀死Chrome和Firefox
slashdottir 2014年

@slashdottir通过检查很容易解决if (level > 10) return level_padding + '<< too deep >>';
John Henckel

由于循环引用(当一个对象的子参数引用其父对象时),就会发生“太多递归”。可以通过记住当前值的所有父级来解决,如果当前值与父级之一匹配,请停止进一步挖掘。
Alex Velickiy

42

如果您使用的是Chrome,Firefox或IE10 +,为什么不扩展控制台并使用

(function() {
    console.dump = function(object) {
        if (window.JSON && window.JSON.stringify)
            console.log(JSON.stringify(object));
        else
            console.log(object);
    };
})();

一个简洁的跨浏览器解决方案。


我喜欢这一个。特别是对于不支持对象转储的浏览器。
Aley

也许替换为“ else console.log(object);” 与调用上面的stackoverflow.com/a/3011557/2236012中的自定义遍历函数??;)
CB

@CB“太多的递归”和冻结的浏览器使我在Firefox和Chrome中工作。
slashdottir 2014年

3
JSON.stringify无法序列化循环结构。不适用于所有对象。
Grzegorz Luczywo 2014年

24

只需使用:

console.dir(object);

您将获得一个不错的可点击对象表示形式。适用于Chrome和Firefox


1
Chrome和Firefox提供[object Object]
slashdottir 2014年

您可以使用以下命令在控制台中进行测试(命中F12):console.dir({bar:"foo"}); 对象是否覆盖toString方法?
mons droid 2014年

似乎至少在控制台中工作。可能是我的用户。谢谢你
slashdottir 2014年

如此甜蜜的功能
tomalone



4

使用console.log(object)会将您的对象扔到Javascript控制台,但这并不总是您想要的。使用JSON.stringify(object)将返回大多数内容以存储在变量中,例如将其发送到textarea输入并将内容提交回服务器。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.