【问题标题】: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 方法,也可以调用另一个函数,如各种答案所示。

标签: javascript debugging


【解决方案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) 可以工作。因此所有对象都可以在收到警报时共享该方法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-07
        • 2011-10-26
        • 2014-03-08
        • 2013-12-11
        • 2011-03-27
        • 1970-01-01
        • 2012-10-26
        相关资源
        最近更新 更多