【问题标题】:How might one look at an object in JavaScript to find out what it is?一个人如何查看 JavaScript 中的对象以找出它是什么?
【发布时间】:2011-06-13 11:24:59
【问题描述】:

注意:我将在这里使用特定对象作为示例,但请不要发布针对此示例的特定答案;这个问题更笼统。

具体例子

我写了一些这样的jQuery代码......

$('#some_button').click(function(event) {
    $.post('<some URL>', { <some parameters> },
        function() { <do something on success> })
        .error(function(x) {
            // What is x?
        });
    event.preventDefault();
});

现在,出于这个问题的目的,我们假设没有关于传入的对象 x 的文档。

一个显而易见的事情可能是

alert(x);

但所有输出都是[object Object]

一般问题

找出未知对象具有哪些属性/方法的简单方法是什么?我在想一些我只是在调试阶段写的东西,当然没有生产代码。

你可以假设 jQuery 是可用的。

编辑:

我完全了解for (...),但这并不意味着没有更好/更简单的方法——我认为 jQuery 可能内置了一些东西......

【问题讨论】:

  • 听说过for…in吗?真的,我不希望 17k 用户会提出这个问题。 ;)
  • @Marcel - 17K 与它有什么关系?
  • @Ash:查看 Timwi 的个人资料,我看到他回答了很多问题,所以我认为他能够自己解决这个问题。
  • @Marcel Korpel:实际上,大部分答案都与 JavaScript 无关。

标签: javascript jquery object


【解决方案1】:

通用且单级的基本 javascript 解决方案

基本功能如下所示:

var s = "";
for(var p in obj)
{
    s += p + " = " + obj[p] + "\n";
}
alert(s);

对象图问题

它将枚举对象的所有属性。如果此特定对象具有深层对象树,则最好将其放入函数中,然后在子对象上调用它。使用相同的技术枚举内部子对象。数组也是类似的问题。

但我想你可以从这个起始示例代码中提供这种功能。

浏览器控制台解决方案

如果您在浏览器中打开了开发控制台(在 Firefox 中将是 Firebug),那么您可以轻松地调用它:

console.log(obj);

但是 IE 有一个问题,因为当涉及到一个复杂的对象时,它只是显示 {...} 这并没有真正的帮助。所以这种方式只能在Chrome和Firefox+Firebug中使用。

适用于任何浏览器的 jQuery 插件

这是我想出的一个小而简单的插件,用于枚举任意对象并在浏览器的控制台中显示其内容:

$.extend({
    inspect: function(obj,n){
        n = n || "this";
        if ($.isArray(obj)) {
            for (var x = 0; x < obj.length; x++) {
                $.inspect(obj[x], n + "[" + x + "]");
            }
            return;
        }
        if ($.isPlainObject(‌​obj)) {
            for (var p in obj){
                $.inspect(obj[p], n + "." + p);
            }
            return;
        }
        console.log(n + " = " + obj.toString());
    }
});

此代码适用于任何浏览器(我实际上需要它用于 IE,因为前面提到的 {...} 显示问题。

只要浏览器的控制台打开,它就会将对象图解析到控制台中。在 IE 和 Chrome 中是内置的开发控制台,在 Firefox 中是 Firebug 控制台。

您可以将其用作:

$.inspect(yourObject);

$.inspect(yourObject, "person");

第二个可选参数用于在显示对象时为其命名。如果您不提供名称,它将被设置为"this"。您的对象将显示为:

this.name = "John"
this.lastname = "Doe"

【讨论】:

  • 您的过程将无限循环以获取任何自引用(即圆形)对象。
  • @davin:是的。我也可以把第三个参数定义为maxDepth
  • 这是一种解决方案,尽管它非常难看,因为通常人们使用宽松的上限。因此,对于 maxDepth 迭代,您将继续打印出所有相同的值。唯一的方法是了解对象,这通常是困难的,特别是 OP 说他不熟悉对象。如果你知道这个对象,那么你通常不需要检查它。还有其他一些效率稍低的解决方案,尽管这是一个适合的开发例程,例如存储引用。
  • 如果 x 是一个主机对象、字符串、布尔值或除数组或“普通”对象之外的任何东西怎么办?
  • @RobG,然后在调用它的toString 方法后打印它。只有主机对象可能会被证明是棘手的,但这更像是 IMO 的极端情况。
【解决方案2】:

console.log 就是为此而构建的。

或者(虽然我不确定有什么比第一个选项更好)您自己的递归实现,它使用简单的for(parameter in obj){ ... } 循环遍历对象属性

【讨论】:

    【解决方案3】:
    console.log
    

    通常会让您更​​好地了解对象的属性。

    【讨论】:

      【解决方案4】:

      您最好的选择是使用带有Firebug plugin 的浏览器(如 Google Chrome 或 Firefox),然后您可以添加断点并检查对象。如果它只是一个简单的 Javascript 对象,您可以像这样遍历属性:

      for(name in object) { 
        alert("name: " + name + "value:" + object[name]);
      }
      

      另一个选项可能是序列化为 JSON 并输出。可以在here找到解决方案。

      【讨论】:

        【解决方案5】:

        在 javascript 中很难编写一个通用函数来确定标识符是否引用任何特定类型的值。大多数此类功能仅限于特定情况。如果不限于特定范围,一般的“这是什么”功能实际上是不可能的。

        如果有这样的功能,你会用它做什么?

        javascript 中的一般方法是测试特定目的所需的属性或功能。走得更远有什么意义?

        【讨论】:

          【解决方案6】:

          控制台.log 和 obj 类型 就足够了。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-10-04
            • 1970-01-01
            • 2017-04-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多