IE8 for ...在枚举器中

ran*_*mor 12 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
Run Code Online (Sandbox Code Playgroud)

在chrome和其他人中,我只会得到0-3,没有神秘的"indexOf"的东西.为什么以及解决了什么?

ben*_*tah 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];
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

但要清楚:您仍然不应该在数组上使用此方法.


Aln*_*tak 7

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

请改用:

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

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