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

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


当前回答

下面是如何枚举一个对象的属性:

var params = { name: 'myname', age: 'myage' }

for (var key in params) {
  alert(key + "=" + params[key]);
}

其他回答

Python的dict有'keys'方法,这真的很有用。我认为在JavaScript中我们可以有这样的东西:

function keys(){
    var k = [];
    for(var p in this) {
        if(this.hasOwnProperty(p))
            k.push(p);
    }
    return k;
}
Object.defineProperty(Object.prototype, "keys", { value : keys, enumerable:false });

编辑:但是@carlos-ruana的答案很好。我测试了Object.keys(窗口),结果是我所期望的。

5年后再编辑:扩展Object不是一个好主意,因为它可能会与其他想要在其对象上使用键的库发生冲突,并且会在您的项目中导致不可预知的行为。@carlos-ruana答案是获取对象键的正确方法。

下面是如何枚举一个对象的属性:

var params = { name: 'myname', age: 'myage' }

for (var key in params) {
  alert(key + "=" + params[key]);
}

如果您试图枚举属性以便针对对象编写新代码,我建议使用像Firebug这样的调试器来可视化地查看它们。

另一种方便的技术是使用Prototype的object . tojson()将对象序列化为JSON,这将显示属性名和值。

var data = {name: 'Violet', occupation: 'character', age: 25, pets: ['frog', 'rabbit']};
Object.toJSON(data);
//-> '{"name": "Violet", "occupation": "character", "age": 25, "pets": ["frog","rabbit"]}'

http://www.prototypejs.org/api/object/tojson

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

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

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

Object.getOwnPropertyNames (obj)

查看ECMAScript 5兼容性表

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

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

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