如何在JavaScript / jQuery中获取对象的属性?


Answers:


141

您可以通过调用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);
});

除了六个基本类型外,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]


31
“一切都是对象”,这是不对的,这是该语言中的一大误解。我们称之为原始类型:数字,字符串,布尔值,未定义和空值。它们通常会与原始包装器混淆,原始包装器是使用内置构造函数创建的对象,例如:typeof new String("foo");产生“对象”,它是包装的原始值,而typeof "foo";产生“字符串”。另请参阅
CMS 2010年

我同意CMS,一旦遇到原始字符串和String对象之间的差异,就可以实现自己的功能,尤其是在尝试最小化代码时。
vol7ron

7
@CMS也不太正确。“原始”字符串本身就是对象。它只是有不同的方法选择。同样使用数字和布尔值。但是,Undefined和Null是没有方法的原语。
Izkata

@Izkata不是真的。 var str = 'primitive'; str.foo = 'bar'; /*wouldn't work*/相反,var oStr = new String('string object'); oStr.foo = 'bar'; /*works*/ 如果要抽象化它并将其称为所有对象,则可以将基元视为基元对象,但这并不等同于真正的JavaScript对象的超类。
vol7ron 2015年

仅仅用于console.log检查物体
约翰·史密斯

13

要获得对象属性/值的列表:

  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. <object> 上面的替换为对对象的变量引用。
  2. console.log() 用于控制台,如果不确定是什么,可以将其替换为 alert()

7

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

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

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

ii)这是什么类型的对象

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

Object.prototype.toString.apply(obj);

许多isArray实现使用这种技术来发现对象是否实际上是数组(尽管它在IE中不像在其他浏览器中那样健壮)。


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

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


4

我希望这不会被视为垃圾邮件。在无休止的调试会话后,我虚心地写了一个函数: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));

2

获取适用于Mozilla Firefox的FireBug

console.log(obj);


1
我看不到您的萤火虫与我的萤火虫有什么不同,但是我将使用dir而不是log来列出对象
vol7ron 2010年

console.log同样有效,您可以单击日志中的对象以获取“目录” ...
gnarf

1

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; });

为此,您会喜欢它。


0

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

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));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.