2

我试图获取/计算对象的属性并找到了这个 QaA这个跨浏览器解决方案

但是,Object.keys并不总是返回与 with 相同的值for-in loop

var obj = {foo: "foo", bar: "bar"};

// foo, bar
console.log(Object.keys(obj));

// foo, bar
for(var p in obj) {
    console.log(p);
}
var obj = document.body.style;

// [] <-- empty array
console.log(Object.keys(obj));

// background, backgroundImage, border, fontFamily...
for(var p in obj) {
    console.log(p);
}

我不确定对象document.body.style是否是enumerable.

即使它们是,根据 Mozilla,我们也可以使用不可Object.getOwnPropertyNames枚举的属性,但它也返回一个空数组。

有人可以解释一下吗?是否有可能在document.body.style没有 for-in 循环的情况下获得对象的所有属性?

编辑

糟糕,我只用 Firefox 进行了测试。在 Osiris 发表评论之前,我意识到这只发生在Firefox(19 和 20 是最新版本)上。IE 9、Opera 12、Chrome 26、Safari 5 都可以。

4

2 回答 2

0

的属性document.body.style在 Firefox 中不可枚举。您可以使用以下方法轻松测试:

document.body.style.propertyIsEnumerable('background'); // FF: false, WebKit: true
于 2013-04-23T10:26:55.500 回答
0

这取决于您要计算的属性类型。

对于...在

遍历对象的所有可枚举属性,包括在原型链中找到的属性。

对象键

返回可以直接在对象上找到的所有可枚举属性。不考虑原型链的属性。

Object.getOwnPropertyNames

返回可以直接在对象上找到的所有属性,无论是否可枚举。不考虑原型链的属性。

根据对象,这些方法当然可以返回不同的结果。使这更加复杂的是对象(或原型)可能具有在一个浏览器中可枚举而在另一个浏览器中不可枚举的属性。

于 2013-04-23T10:51:03.120 回答