Javascript中的for (i in a)
結構列出了標記爲enumerable
的JavaScript對象的屬性。它列出了對象的所有可枚舉屬性,無論它們是直接在對象上還是通過原型繼承。 'enumerable`是一個屬性的特定特徵。您可以擁有可枚舉或不可枚舉的對象的屬性。
.length
屬性未標記爲可枚舉,因此它不顯示使用for (i in a)
結構。如果使用Object.defineProperty()
自己創建屬性,則可以控制可枚舉屬性(以及其他幾個屬性)。如果你直接添加一個屬性而沒有使用Object.defineProperty()
來指定它的自定義屬性,那麼這個屬性默認是可枚舉的。
For a variety of reasons,你不應該嘗試用for (i in a)
結構迭代Array的元素。該結構被明確地設計爲列出一個Javascript對象的可枚舉屬性,該對象將包含所有數組元素,但也可能包含其他可枚舉屬性(如您所見)。
for (var i = 0, len = array.length; i < len; i++) {
// array[i]
}
或
array.forEach(function(val, index, array) {
// code here
});
至於你的觀察約.clone
,這不是一個數組對象的標準屬性:數組元素應該被列舉。我猜測它可能已經被一些第三方庫添加到了數組原型中,並且它顯然被標記爲可枚舉,這就解釋了爲什麼它會在你的循環中顯示。
.hasOwnProperty()
通常用來過濾掉所有的原型屬性,因此您只能遍歷被直接應用到這解釋了爲什麼它會過濾掉.clone
屬性(對象(而不是從原型繼承。)性質如果它在原型上)。在任何情況下,如果你的目標是迭代一個數組的元素(而不是任何添加到數組對象的自定義屬性),那麼你應該使用上述兩種迭代方法之一,然後你不會不得不擔心.hasOwnProperty()
或原型或Array對象本身上的其他可枚舉屬性。
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#Enumerable_attribute – zerkms