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

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


当前回答

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

其他回答

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

如果您试图枚举属性以便针对对象编写新代码,我建议使用像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

简单:

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

现在,您不会以这种方式获得私有变量,因为它们不可用。


编辑:@bitwiseplatypus是正确的,除非你使用hasOwnProperty()方法,否则你将获得继承的属性-然而,我不知道为什么任何熟悉面向对象编程的人会期望更少!一般来说,提出这个问题的人都听过道格拉斯·克罗克福德的警告,这让我有点困惑。同样,继承是OO语言的一个正常部分,因此也是JavaScript的一部分,尽管它是原型。

现在,也就是说,hasOwnProperty()对于过滤是有用的,但我们不需要发出警告,就好像获取继承属性是危险的一样。

EDIT 2: @bitwiseplatypus brings up the situation that would occur should someone add properties/methods to your objects at a point in time later than when you originally wrote your objects (via its prototype) - while it is true that this might cause unexpected behavior, I personally don't see that as my problem entirely. Just a matter of opinion. Besides, what if I design things in such a way that I use prototypes during the construction of my objects and yet have code that iterates over the properties of the object and I want all inherited properties? I wouldn't use hasOwnProperty(). Then, let's say, someone adds new properties later. Is that my fault if things behave badly at that point? I don't think so. I think this is why jQuery, as an example, has specified ways of extending how it works (via jQuery.extend and jQuery.fn.extend).

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

你可以使用for of循环。

如果你想要一个数组,请使用:

种(中的object1)

Ref。种()