【问题标题】:How to get an object's properties in JavaScript / jQuery?如何在 JavaScript / jQuery 中获取对象的属性?
【发布时间】:2011-05-04 00:25:05
【问题描述】:

在 JavaScript / jQuery 中,如果我 alert 某个对象,我会得到 [object][object Object]

有没有办法知道:

  1. 这两个对象有什么区别

  2. 这是什么类型的对象

  3. 此对象包含的所有属性以及每个属性的值

?

【问题讨论】:

标签: javascript jquery


【解决方案1】:

您可以通过调用 JavaScript 的原生 for in 循环来查找对象的键和值:

var obj = {
    foo:    'bar',
    base:   'ball'
};

for(var key in obj) {
    alert('key: ' + key + '\n' + 'value: ' + obj[key]);
}

或者使用jQuery的.each()方法:

$.each(obj, function(key, element) {
    alert('key: ' + key + '\n' + 'value: ' + element);
});

With the exception of six primitive types, everything 在 ECMA-/JavaScript 中是一个对象。数组;职能;一切都是对象。甚至这些原语中的大多数实际上也是具有有限方法选择的对象。需要时,它们会被放入引擎盖下的物体中。要知道基类名称,您可以在对象上调用Object.prototype.toString 方法,如下所示:

alert(Object.prototype.toString.call([]));

上面会输出[object Array]

还有其他几个类名,例如[object Object][object Function][object Date][object String][object Number][object Array][object Regex]

【讨论】:

  • “一切都是对象”,这不是真的,这是语言中的一大误解。有我们所说的原始类型:数字、字符串、布尔值、未定义和空值。它们经常与原始包装器(使用内置构造函数创建的对象)混淆,例如:typeof new String("foo"); 产生“对象”,它是一个包装的原始值,而typeof "foo"; 产生“字符串”。 See also
  • 我同意 CMS,一旦你遇到原始字符串和 String 对象之间的差异,你就会意识到你的能力~尤其是在尝试最小化代码时。
  • @CMS 这也不完全正确。 “原始”字符串 is 本身就是一个对象;它只是有不同的方法选择。数字和布尔值也是如此。但是,Undefined 和 Null 是没有方法的原语。
  • @Izkata 不正确。 var str = 'primitive'; str.foo = 'bar'; /*wouldn't work*/var oStr = new String('string object'); oStr.foo = 'bar'; /*works*/ 如果您要将其抽象化并将它们称为所有对象,那么您可以将原语视为原始对象,但它并不等同于真正 JavaScript 对象的超类。
  • 只需使用console.log 来检查对象
【解决方案2】:

为确定的道具的第一个实例扫描对象:

var obj = {a:'Saludos',
            b:{b_1:{b_1_1:'Como estas?',b_1_2:'Un gusto conocerte'}},
           d:'Hasta luego'
            }
function scan (element,list){
    var res;
    if (typeof(list) != 'undefined'){
        if (typeof(list) == 'object'){
            for(key in list){
               if (typeof(res) == 'undefined'){
                res = (key == element)?list[key]:scan(element,list[key]);
               }
            });
        }
    }
    return res;
}
console.log(scan('a',obj));

【讨论】:

    【解决方案3】:

    Spotlight.js 是一个很棒的库,用于遍历窗口对象和其他主机对象以查找某些内容。

    // find all "length" properties
    spotlight.byName('length');
    
    // or find all "map" properties on jQuery
    spotlight.byName('map', { 'object': jQuery, 'path': '$' });
    
    // or all properties with `RegExp` values
    spotlight.byKind('RegExp');
    
    // or all properties containing "oo" in their name
    spotlight.custom(function(value, key) { return key.indexOf('oo') > -1; });
    

    你会喜欢它的。

    【讨论】:

      【解决方案4】:

      获取对象属性/值的列表:

      1. 在 Firefox - Firebug 中:

        console.dir(<object>);
        
      2. 标准JS获取从Slashnick借来的对象键:

           var fGetKeys = function(obj){
              var keys = [];
              for(var key in obj){
                 keys.push(key);
              }
              return keys;
           }
        
        // Example to call it:
        
           var arrKeys = fGetKeys(document);
        
           for (var i=0, n=arrKeys.length; i<n; i++){
              console.log(i+1 + " - " + arrKeys[i] + document[arrKeys[i]] + "\n");
           }
        

      编辑:

      1. 上面的&lt;object&gt;是要替换为对对象的变量引用。
      2. console.log() 将在控制台中使用,如果您不确定那是什么,可以将其替换为 alert()

      【讨论】:

        【解决方案5】:

        我希望这不会被视为垃圾邮件。在无休止的调试会话之后,我谦虚地写了一个函数:http://github.com/halilim/Javascript-Simple-Object-Inspect

        function simpleObjInspect(oObj, key, tabLvl)
        {
            key = key || "";
            tabLvl = tabLvl || 1;
            var tabs = "";
            for(var i = 1; i < tabLvl; i++){
                tabs += "\t";
            }
            var keyTypeStr = " (" + typeof key + ")";
            if (tabLvl == 1) {
                keyTypeStr = "(self)";
            }
            var s = tabs + key + keyTypeStr + " : ";
            if (typeof oObj == "object" && oObj !== null) {
                s += typeof oObj + "\n";
                for (var k in oObj) {
                    if (oObj.hasOwnProperty(k)) {
                        s += simpleObjInspect(oObj[k], k, tabLvl + 1);
                    }
                }
            } else {
                s += "" + oObj + " (" + typeof oObj + ") \n";
            }
            return s;
        }
        

        用法

        alert(simpleObjInspect(anyObject));
        

        console.log(simpleObjInspect(anyObject));
        

        【讨论】:

          【解决方案6】:

          i) 这两个对象有什么区别

          简单的答案是[object] 表示一个没有内部类的宿主对象。主机对象是不属于您正在使用的 ECMAScript 实现的一部分,但由主机作为扩展提供的对象。 DOM 是宿主对象的一个​​常见示例,尽管在大多数较新的实现中,DOM 对象继承自原生 Object 并具有内部类名(例如 HTMLElementWindow 等) . IE 的专有 ActiveXObject 是宿主对象的另一个例子。

          [object] 在 Internet Explorer 7 及更低版本中警告 DOM 对象时最常见,因为它们是没有内部类名的宿主对象。

          ii) 这是什么类型的对象

          您可以使用Object.prototype.toString 获取对象的“类型”(内部类)。规范要求它始终返回格式为[object [[Class]]] 的字符串,其中[[Class]] 是内部类名,例如ObjectArrayDate、RegExp 等。您可以将此方法应用于任何对象(包括宿主对象),使用

          Object.prototype.toString.apply(obj);
          

          许多isArray 实现使用这种技术来发现一个对象是否实际上是一个数组(尽管it's not as robust in IE as it is in other browsers)。


          iii) 该对象包含的所有属性以及每个属性的值

          在 ECMAScript 3 中,您可以使用 for...in 循环迭代可枚举的属性。请注意,大多数内置属性都是不可枚举的。某些宿主对象也是如此。在 ECMAScript 5 中,您可以使用 Object.getOwnPropertyNames(obj) 获取包含所有非继承属性名称的数组。该数组将包含不可枚举和可枚举的属性名称。

          【讨论】:

            【解决方案7】:

            为 Mozilla Firefox 获取 FireBug

            使用console.log(obj);

            【讨论】:

            • 我看不出你的萤火虫和我的有什么不同,但我会使用 dir 而不是 log 来列出对象
            • console.log同样有效,你可以点击日志中的对象获取“目录”...
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-09-15
            • 1970-01-01
            • 1970-01-01
            • 2022-06-28
            • 2016-09-27
            • 2014-09-23
            • 2020-01-12
            相关资源
            最近更新 更多