javascript对象是否有类似toString的函数?

javascript对象是否有类似toString的函数?,javascript,debugging,Javascript,Debugging,在使用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 shou

在使用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'}

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

javascript参考指南说有一个用于javascript对象的toString方法,请参见页面

它在mozilla开发者页面上,但我相信这应该是您所需要的。摘录在这里,” var o=新对象(); o、 toString();“

使用

alert(JSON.stringify(temp)) ;
而不是

alert(temp) ;  
一种解决办法是:

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
参考:

而alert()只会让你更加悲伤,开始使用控制台日志吧。它们是持久性的,允许您更一致地引用输出

参考:

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

参考:

或者其他更好的建议,这样我可以很容易地查找对象

大多数优秀浏览器的控制台都允许您在登录对象时向下钻取该对象。例如,对于Chrome:

console.log(obj);

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

警报调用toString,因此您可以出于调试目的覆盖toString:

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

所以你可以调用
alert(foo),它将显示foo的JSON表示形式。您也可以这样做,以便警报格式可以是您想要的格式

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

您可以使用此功能:

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;
}
功能转储(arr,级别){
var_text=“”;
如果(!level)level=0;
var级别_=”;
对于(var j=0;j 1)
dumped_text=dumped_text.substring(0,dumped_text.length-1);
转储的_text+=“]”;
}else if(类型=='object'){
转储的\u text+=“{\n”;
用于(arr中的var项目){
var值=arr[项目];
转储文本+=级别填充+项目+“:”;
dumped_text+=转储(值,级别+1)+',\n';
}
如果(文本长度>2)
dumped_text=dumped_text.substring(0,dumped_text.length-2);
转储的\u text+=“\n”+级别\u padding.substring(0,级别\u padding.length-4)+“}”;
}else if(type=='string'){
转储_text=“”“+arr+””;
}else if(类型=='number'){
转储_text=arr+“”;
}else if(类型=='boolean'){
转储_text=arr+“”;
}
返回文本;
}

alert(JSON.stringify(temp))怎么样?@jamesalardice是的,这是一个很好的方法,但我想扩展对象定义。在使用数组时,它们会像字符串一样发出警报,这是如何做到的?@RupeshPatel-使用数组的方式是该语言的一个内部部分。ECMAScript规范中详细记录了它。对象的情况并非如此。您可以覆盖
Object.prototype.toString
方法,也可以调用其他函数,如各种答案中所示。问题是关于对象,而不是数组。对不起,我现在明白您的意思了,“我想知道是否有类似于数组的东西”这句话让我困惑。对不起,我发现了什么。还有一些其他的方法可以使用,“这个页面有它们是的,这是一个很好的方法,但是我可以做一些类似数组的东西,这样警报(temp)就可以工作了。”。因此,所有对象在收到警报时都可以共享该方法。哦,天哪,我怎么会忽略这件事。无论如何,谢谢:)希望在您的代码库中,有人没有做不好的对象检测,而您破坏了它,并将其覆盖到全局字符串中。@epascarello对我来说,这只是为了调试目的,完成后评论两行不会有任何关系。谢谢你的评论。这也是一个很好的建议。我想我应该走这条路。谢谢:)