2013-04-23 76 views
2

我試圖獲得/計數一個對象的屬性,發現this QaAthis cross-browser solution如何在不使用JavaScript中的for-in循環(Firefox)的情況下獲取對象的所有屬性?

但是,Object.keys並不總是返回與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。我們可以使用Object.getOwnPropertyNames代替無枚舉屬性,但它也返回一個空數組。

有人可以解釋這一點嗎?是否有可能獲得像document.body.style這樣的對象的所有屬性,而無需for-in循環?

編輯

糟糕,我只用Firefox進行了測試。在Osiris發表評論之前,我意識到這隻發生在Firefox(19和20是最新版本)。 IE 9,Opera 12,Chrome 26,Safari 5都很好。

+0

在Chrome的DevTools中,Object.keys(document.body.style)'返回一個由394個元素組成的數組。 – Osiris 2013-04-23 10:19:06

回答

0

document.body.style的屬性在Firefox中不可枚舉。您可以使用以下方式輕鬆測試:

document.body.style.propertyIsEnumerable('background'); // FF: false, WebKit: true 
+0

因爲所有其他瀏覽器都返回一些屬性,這是否被認爲是一個錯誤? – user1643156 2013-04-23 10:28:42

0

這取決於您要計數的屬性類型。

用於...在

遍歷包括原型鏈發現屬性的對象的所有枚舉性質。

Object.keys

返回可以直接在對象中找到所有枚舉性質。不考慮原型鏈的屬性。

Object.getOwnPropertyNames

返回所有屬性,枚舉與否,可以直接在對象被發現。不考慮原型鏈的屬性。

根據對象的不同,這些方法當然可以返回不同的結果。更爲複雜的是,對象(或原型)可能具有可在一個瀏覽器中枚舉的屬性,而不在另一個瀏覽器中。

+0

對於像'document.body.style'這樣的對象,我使用哪種方法並不重要,所有這三種方法在所有其他瀏覽器都應該返回一些屬性。我相信這是一個錯誤(直到20版才能確定)。 – user1643156 2013-04-23 10:57:42

+0

我想說它沒有指定,但可以被視爲一個錯誤。除此之外,如果你唯一關心的是'document.body.style',你應該可以在所有三種之間自由選擇,沒錯。 – zeroflagL 2013-04-23 11:10:49

相關問題