2012-01-31 33 views
12

所以我在IE8中使用這樣的:IE8的...在枚舉

var hi=["hi", "lo", "foo", "bar"]; 
for(i in hi){console.log(i)}; 
//WTF is that indexOf i value? 
LOG: 0 
LOG: 1 
LOG: 2 
LOG: 3 
LOG: indexOf 
undefined 

在Chrome和其他人,我就拿到0-3,沒有神祕 「的indexOf」 的事情。爲什麼和什麼是修復?

回答

23

不要對陣列使用for...in。在這種情況下最好使用傳統的for循環。

原因是因爲for...in將數組視爲對象,因此可能在循環中包含indexOflength之類的屬性。正常的for循環只處理數字鍵,所以避免了這個問題。

在附註上,在遍歷純對象時也會出現不需要的屬性(如其他人注意到的那樣,添加到對象原型的屬性將顯示出來)。您可以通過編寫for...in循環這種方式解決這個問題:

var obj = { ... }; 
for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) { 
    var item = obj[prop]; 
    ... 
    } 
} 

需要明確的是,雖然:你仍然不應陣列使用此方法。

+0

謝謝!忍者... – randomor 2012-01-31 18:52:39

7

你使用了錯誤的循環類型的數組 - for ... in ...還將包括對象,而你的情況包括:.indexOf()方法的任何枚舉性能。

使用這個代替:

var i, n = hi.length; 
for (i = 0; i < n; ++i) { 
    console.log(i, hi[i]); 
} 

Chrome和其他最新的瀏覽器實現的ECMAScript 5,正確標記所有內置的方法作爲不可枚舉性能。

+1

哈,我們再戰! – benekastah 2012-01-31 18:41:59

+0

'indexOf'不是IE8中的數組方法,它是從用戶添加的,這就是爲什麼它出現 – Esailija 2012-01-31 18:47:08

+0

IE8沒有'indexOf()'?哇... – Alnitak 2012-01-31 18:49:25

4

發生這種情況是因爲您在頁面上包含的腳本正在將indexOf方法添加到Array.prototype。這意味着所有數組都繼承了indexOf方法,這很好,因爲它意味着即使在IE8中也可以使用該方法。

但是,由於無法在IE8中將屬性標記爲非枚舉屬性,因此每次枚舉數組的所有屬性時都會看到它,這就是您在for - in循環。您可能需要一個for循環。