2012-01-31 34 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循环。