所以我在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” 的事情。为什么和什么是修复?
所以我在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” 的事情。为什么和什么是修复?
不要对阵列使用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];
...
}
}
需要明确的是,虽然:你仍然不应阵列使用此方法。
你使用了错误的循环类型的数组 - for ... in ...
还将包括对象,而你的情况包括:.indexOf()
方法的任何枚举性能。
使用这个代替:
var i, n = hi.length;
for (i = 0; i < n; ++i) {
console.log(i, hi[i]);
}
Chrome和其他最新的浏览器实现的ECMAScript 5,正确标记所有内置的方法作为不可枚举性能。
哈,我们再战! – benekastah 2012-01-31 18:41:59
'indexOf'不是IE8中的数组方法,它是从用户添加的,这就是为什么它出现 – Esailija 2012-01-31 18:47:08
IE8没有'indexOf()'?哇... – Alnitak 2012-01-31 18:49:25
发生这种情况是因为您在页面上包含的脚本正在将indexOf
方法添加到Array.prototype
。这意味着所有数组都继承了indexOf
方法,这很好,因为它意味着即使在IE8中也可以使用该方法。
但是,由于无法在IE8中将属性标记为非枚举属性,因此每次枚举数组的所有属性时都会看到它,这就是您在for
- in
循环。您可能需要一个for
循环。
谢谢!忍者... – randomor 2012-01-31 18:52:39