所以我在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”的东西。为什么以及解决了什么?
答案 0 :(得分:23)
不要将for...in
用于数组。在这种情况下,最好使用传统的for
循环。
原因是因为for...in
将数组视为对象,因此循环中可能包含indexOf
或length
等属性。普通的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
循环。