我如何枚举一个JavaScript对象的属性?

我实际上想列出所有已定义的变量及其值,但我已经了解到,定义变量实际上创建了窗口对象的属性。


当前回答

for (prop in obj) {
    alert(prop + ' = ' + obj[prop]);
}

其他回答

我认为一个让我吃惊的案例是相关的:

var myObject = { name: "Cody", status: "Surprised" };
for (var propertyName in myObject) {
  document.writeln( propertyName + " : " + myObject[propertyName] );
}

但令我惊讶的是,输出是

name : Cody
status : Surprised
forEach : function (obj, callback) {
    for (prop in obj) {
        if (obj.hasOwnProperty(prop) && typeof obj[prop] !== "function") {
            callback(prop);
        }
    }
}

为什么?页面上的另一个脚本扩展了Object原型:

Object.prototype.forEach = function (obj, callback) {
  for ( prop in obj ) {
    if ( obj.hasOwnProperty( prop ) && typeof obj[prop] !== "function" ) {
      callback( prop );
    }
  }
};

简单JavaScript代码:

for(var propertyName in myObject) {
   // propertyName is what you want.
   // You can get the value like this: myObject[propertyName]
}

jQuery:

jQuery.each(obj, function(key, value) {
   // key is what you want.
   // The value is in: value
});

在现代浏览器(ECMAScript 5)中,要获得所有可枚举属性,您可以做:

种(obj) (请检查链接以获得在旧浏览器上向后兼容的代码片段)

或者也可以得到不可枚举的属性:

Object.getOwnPropertyNames (obj)

查看ECMAScript 5兼容性表

额外的信息: 什么是可枚举属性?

如果你使用的是Underscore.js库,你可以使用函数键:

_.keys({one : 1, two : 2, three : 3});
=> ["one", "two", "three"]
for (prop in obj) {
    alert(prop + ' = ' + obj[prop]);
}