2012-09-26 20 views
1
var yourObjects = [ 

{ object: {obj1:"aa"}, direction: 'top' }, 
{ object: "obj2", direction: 'left' }, 
{ object: "obj3", direction: 'bottom' } 

]; 

for (var i in yourObjects) { alert(i); } 

有關於長時間的討論。 使用for in迭代Object返回Object的所有屬性和方法,因此通常應使用.hasOwnProperty()方法。但是當我們迭代一個數組時,事實上for in迭代了數組的索引(如果它是一個關聯數組,則爲鍵)。我在所有瀏覽器中都嘗試過。但是當在jsfiddle中嘗試時......它不一樣......返回數組所有的所有方法。爲(VAR我在yourObjects){...}和.hasOwnProperty()...討論

所以我的問題是:使用for in迭代數組安全嗎?

在您的瀏覽器和jsfiddle中嘗試這個代碼,然後告訴我您的想法。

+0

javascript中的關聯數組是一個「Object」。 – undefined

+0

實際上'isArray()'爲Assoc的返回true。數組...而對於對象爲false – Reflective

+1

Javascript有關於類型,平等和其他內容的有趣「意見」。 :) [見這裏](http://www.codeproject.com/Articles/182416/A-Collection-of-JavaScript-Gotchas) – undefined

回答

7

在數組上使用for-in的原因不止一個。

記住在JavaScript中,Array只是一種Object,所以在Array上做for-in與在普通Object上做for-in沒有什麼不同。

在您的jsFiddle中,您可能在左側選擇了一個庫,擴充了Array.prototype,這將是這些方法的來源。

但還有另一個原因。 A for-in不保證枚舉屬性的順序。因爲沒有限制,它可以按順序枚舉索引,並完全符合ECMAScript。

另外,還有類似數組的集合,如NodeLists,它們也不應該使用for-in,因爲它們包含除DOM元素外可以枚舉的默認屬性。

簡單的事實是,在JavaScript中,for-in不適合基於索引的枚舉。


對於對象,你應該只需要使用hasOwnProperty時,有它的特殊需要。

有人建議它必須用在所有物體上。這是一個非常偏執的心態。該方法是應該在那些有意義的情況下使用的警衛。

大多數情況下,只要符合良好的編程習慣,使用它就沒有任何意義。這包括不在Object.prototype上放置可枚舉的屬性。這是編程環境的一個簡單而合理的要求。

做的時間有意義的是,當您枚舉從自定義構造函數創建的對象時,該對象的.prototype擴展了可枚舉屬性。在這種情況下,這是一個適當的保護措施。

在普通物體上使用它是一個巨大的矯枉過正,當一個更合理的方法是簡單的要求,你的環境不會改變Object.prototype