Javascript IE8用于枚举器中的

Javascript IE8用于枚举器中的,javascript,internet-explorer-8,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”东西。为什么以及解决方法是什么?不要将用于…而将用于阵列。在这种情况下,最好使用传统的for循环 原因

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

不要将
用于…而将
用于阵列。在这种情况下,最好使用传统的
for
循环

原因是
for…in
将数组视为对象,因此循环中可能会包含
indexOf
length
等属性。正常的
for
循环只处理数字键,因此避免了此问题

在旁注上,当在普通对象上迭代时,也可能会显示不需要的属性(正如其他人所指出的,添加到对象原型中的属性将显示)。您可以通过以下方式在
循环中为…编写

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

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

您对数组使用了错误类型的循环-
用于。。。在…
中,还将包括对象的任何可枚举属性,在您的示例中包括
.indexOf()
方法

改用这个:

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

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

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


但是,由于在IE8中无法将属性标记为不可枚举,因此每次枚举数组的所有属性时都会看到它,这就是在
for
-
in
循环中所做的。您可能希望为
循环使用

indexOf
在IE8中不是数组方法,它是从用户处添加的,这就是它出现的原因