IE8 for ...在枚举器中

时间:2012-01-31 18:39:10

标签: javascript internet-explorer-8

所以我在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”的东西。为什么以及解决了什么?

3 个答案:

答案 0 :(得分: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];
    ...
  }
}

要明确:您仍然不应该在数组上使用此方法。

答案 1 :(得分:7)

您对数组使用了错误类型的循环 - for ... in ...还将包含对象的任何可枚举属性,在您的情况下包含.indexOf()方法

请改用:

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

Chrome和其他最新浏览器实施ECMAScript 5,并将所有内置方法正确标记为不可枚举的属性。

答案 2 :(得分:4)

这种情况正在发生,因为您在网页上添加的脚本正在将indexOf方法添加到Array.prototype。这意味着所有数组都继承了indexOf方法,这很好,因为这意味着即使在IE8中也可以使用该方法。

但是,由于无法在IE8中将属性标记为不可枚举,因此每次枚举数组的所有属性时都会看到它,这就是您在{{1}中所做的事情。 } - for循环。你可能想要一个in循环。