你是不是第一次混合數組和對象。 SO應該包含這樣的問題,常見問題解答;)
讓我們試着去解釋的東西:
的陣列是值的列,可以使用他們的行中的位置進行檢索。數組值的順序是固定的(並且可以重新排序)。
An object是一個包含鍵值對形式的命名屬性的變量。屬於一個對象的鍵值對的順序是任意的。
陣列看起來像:[ 'first', 'second', 'third', ..., 'nth' ]
一個目的看起來像:{ first:'firstvalue', second:'secondvalue', ..., nth:'nthvalue' }
陣列的第一個元素是索引爲0的元件(因此該行中的第一位置具有索引值0)。您使用myArray[0]
對象是無序的,所以它沒有第一個元素。您使用myObject.somekey
或myObject['somekey']
從中檢索任何元素。
對於您使用的是循環遍歷編號的指標,直到數組結束遍歷數組達到:
var i=0, len = myArray.length;
for (i; i<len; i++) {
//do something with >>> myArray[i] <<<
}
對於對象使用一個循環利用的關鍵和in
操作(確保你只檢索對象的用戶定義的屬性與.hasOwnAttribute
法):
for (var key in myObject){
if (myObject.hasOwnProperty(key)) {
// do something with >>> myObject[key] <<<
}
}
基本上,認爲陣列的與抽屜一個櫃子,每個包含一個值。一個物體可以想象成一堆盒子上帶有貼紙的盒子,描述盒子的內容。從一個物體中檢索某物,你問:在x中是否有一個貼紙y的盒子,如果有的話,那裏有什麼?從數組中檢索一些東西,你問:請給我抽屜的內容或者x。
現在,作爲你的問題:您是一個for..in
循環檢索值的數組包含一個用戶定義的方法,即indexOf
。使用它的對象樣式循環,數組被視爲對象,並顯示indexOf
鍵(值爲function(){...}
我敢打賭)。 IE這就是爲什麼在迭代數組時使用帶有數字索引的傳統for循環可能更好。
這是爲什麼只能在IE?在現代瀏覽器中,indexOf
是Array
原型的本地方法,並且不顯示本地方法(除非循環遍歷它們的原型)。 IE < 9沒有用於數組的本機indexOf方法。您在使用該方法的腳本中的某處已添加到Array原型作爲用戶定義的擴展。
您的問題底線:不通過數組的值,用for ... in
循環。
僅供參考,我不得不使用'myObject.hasOwnProperty(key)'。不知道爲什麼,但如果你遇到上述問題可能會有所幫助 – cowls 2014-04-17 08:26:54
@cowls:很好的發現。這是一個混淆/錯字,我糾正了答案。 – KooiInc 2014-04-17 09:04:36