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

Posted

技术标签:

【中文标题】javascript 对象是不是有类似 toString 的函数?【英文标题】:Is there a toString-like function for javascript objects?javascript 对象是否有类似 toString 的函数? 【发布时间】:2012-07-22 20:16:24 【问题描述】:

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

或任何其他更好的建议,以便我可以轻松查找对象。

【问题讨论】:

alert(JSON.stringify(temp)); 怎么样? @JamesAllardice 是的,它很好,但我想扩展对象定义。如果数组像字符串一样被警告,它是如何完成的? @RupeshPatel - 使用数组的方式是语言的内部部分。它在 ECMAScript 规范中有详细记录。对象也不一样。您可以覆盖Object.prototype.toString 方法,也可以调用另一个函数,如各种答案所示。 【参考方案1】:

你可以使用这个功能:

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;

【讨论】:

【参考方案2】:

您也可以这样做,这样警报格式可以是您想要的格式

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

【讨论】:

这也是一个很好的建议,我想我应该走这条路谢谢:)【参考方案3】:

javascript参考指南说javascript对象有一个toString方法,见页面https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/toString

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

【讨论】:

问题是询问对象,而不是数组。 对不起,我明白你现在的意思,“我想知道是否有类似数组的东西”让我感到困惑。对不起 针对我发现的内容进行了编辑。还有一些其他方法可以配合这些方法,“developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…”这个页面有它们【参考方案4】:

一种解决方案是:

dump() - Javascript equivalent of php's print_r() function

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

参考:How Can I Beautify JSON Programmatically

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

参考:How to Print Debug Messages in the google chrome javascript console

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

参考:How do you launch the javascript debugger in Google Chrome?

【讨论】:

【参考方案5】:

警报调用 toString,因此您可以覆盖 toString 以进行调试:

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

所以你可以直接调用alert(foo);,它会显示 foo 的 JSON 表示

【讨论】:

天哪,我怎么忽略了这件事。感谢任何方式:) 希望在您的代码库中,有人没有进行不良对象检测,而您将其破坏为全局覆盖 toString。 @epascarello 对我来说只是为了调试目的,在完成后评论两行不会有任何问题。感谢您的评论。【参考方案6】:

或任何其他更好的建议,以便我可以轻松查找对象。

如果您记录一个对象,大多数优秀浏览器的控制台都可以让您深入了解它。例如,使用 Chrome:

console.log(obj);

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

【讨论】:

【参考方案7】:

使用

alert(JSON.stringify(temp)) ;

而不是

alert(temp) ;  

【讨论】:

是的,它很好,但我可以做一些像数组这样的东西,所以 alert(temp) 可以工作。因此所有对象都可以在收到警报时共享该方法。

以上是关于javascript 对象是不是有类似 toString 的函数?的主要内容,如果未能解决你的问题,请参考以下文章

子类化 Javascript 数组。 TypeError:Array.prototype.toString 不是通用的

JavaScript的toString()

JavaScript中是不是有类似forEach的函数,但它只返回索引,而不是对象和索引[关闭]

JavaScript之Date日期对象扩展

为什么toString方法可以用来区分数组和对象?

始终要覆盖toString实现可以使类用起来更加舒服