JavaScript对象有类似于toString的函数吗?

3
在使用javascript进行调试和开发时,我经常希望能够警告对象,因此我使用以下代码:
for(a in obj)
{
  alert(a +' = '+obj[a])
}    

这个很实用,但太麻烦了。我想知道是否有类似于这个的用于数组的东西:

var temp = ['a','b','c'];
alert(temp); // it will alert a,b,c 

所以我想要做的是:
var temp = {a:'a',b:'b',c:'c'};
alert(temp) ; // It should alert json {a:'a',b:'b',c:'c'}

或者有更好的建议,这样我就可以轻松地查找对象。

3
alert(JSON.stringify(temp)); 怎么样? - James Allardice
@JamesAllardice 是的,这是个好方法,但我想扩展对象定义。在数组的情况下,如何像字符串一样进行警报? - Rupesh Patel
1
@RupeshPatel - 数组的处理方式是语言内部的一部分。它在ECMAScript规范中有详细记录。但对象不是这样。您可以覆盖Object.prototype.toString方法,或者像各种答案中所示那样调用另一个函数。 - James Allardice
7个回答

4

警告调用toString,因此您可以重写toString进行调试:

Object.prototype.toString = function() {
    return JSON.stringify(this);
};

那么,您只需调用 alert(foo);,它将显示 foo 的JSON表示形式。

哦,我的天啊,我竟然忽略了这个东西。不管怎样,还是谢谢你 :) - Rupesh Patel
希望在你的代码库中,没有人会进行糟糕的对象检测,并通过全局覆盖toString方法来破坏它。 - epascarello
@epascarello 对我来说,这只是为了调试目的,在完成后注释掉两行不会有任何影响。感谢您的评论。 - Rupesh Patel

3

使用

alert(JSON.stringify(temp)) ;

取代

alert(temp) ;  

是的,这很不错,但我是否可以制作一些类似于数组的东西,以便警报(temp)可以工作。这样,无论何时提示所有对象都可以共享该方法。 - Rupesh Patel

1

您也可以这样做,以便警报的格式符合您的要求

 Object.prototype.toString = function{
    var str='';
    for(a in this)
    {
      str+=a +' = '+obj[a]);
    }    
    }

这也是一个很好的建议,我想我应该这样做,谢谢 :) - Rupesh Patel

0

你可以使用这个函数:

function dump(arr,level) {
    var dumped_text = "";

    if(!level) level = 0;
    var level_padding = "";

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

    var type = typeof(arr);

    if (arr === null){
        dumped_text = "null";
    } else if (arr instanceof Array) {
        dumped_text += "[";

        for(var item in arr) {
            var value = arr[item];
            dumped_text += dump (value, level+1) + ',';
        }

        if(dumped_text.length > 1)
            dumped_text = dumped_text.substring (0, dumped_text.length-1);
        dumped_text += "]";
    } else if(type == 'object') {
        dumped_text += "{\n";

        for(var item in arr) {
            var value = arr[item];
            dumped_text += level_padding + item + " : ";
            dumped_text += dump(value,level+1) + ',\n';
        }

        if(dumped_text.length > 2)
            dumped_text = dumped_text.substring (0, dumped_text.length-2);

        dumped_text += "\n" + level_padding.substring (0, level_padding.length-4) + "}";
    } else if (type == 'string'){
        dumped_text = "'" + arr + "'";
    } else if (type == 'number'){
        dumped_text = arr + "";
    } else if (type == 'boolean'){
        dumped_text = arr + "";
    }
 return dumped_text;
}

0
一个解决方案是:

dump() - PHP的print_r()函数的Javascript等效函数

Perl提供了Data::Dumper来处理这样的工作。非常适合这种情况。非常适合调试。
更好的方法是使用JSON.stringify:
JSON.stringify({a:1,b:2,c:{d:1,e:[1,2]}}, null, 4); // Indented 4 spaces
JSON.stringify({a:1,b:2,c:{d:1,e:[1,2]}}, null, "\t"); // Indented with tab

参考:如何以编程方式美化JSON

alert()只会给你带来更多的烦恼,开始使用控制台日志。它们是持久的,并允许您更一致地引用输出。

参考:如何在Google Chrome JavaScript控制台中打印调试消息

更好的方法是:使用JavaScript调试器分析您的对象。这通常比简单地打印或警报要好得多。但是,如果您必须在许多位置执行此操作,则通常最好使用控制台日志。

参考:如何在Google Chrome中启动JavaScript调试器?


0
或者有其他更好的建议,这样我就可以轻松地查找对象。大多数好的浏览器控制台都可以让您深入了解一个对象,如果您将其记录下来。例如,在Chrome中:
console.log(obj);

将树形视图对象记录到控制台。


0

这个问题是关于对象,而不是数组的。 - James Allardice
抱歉,我现在明白你的意思了。那句话,“我想知道是否有像数组一样的东西”让我感到困惑。对不起。 - john2o01
这是与之配套的其他一些方法,"https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object" 这个页面有它们。 - john2o01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接