6

在 IE8 中测试一些 JavaScrpt 代码时,我在执行简单的 for..in 循环时遇到了一些奇怪的行为:

var categories = ['for', 'bar', 'steam'];
for(var key in categories) {
    console.log(key);
}

输出:

0
1
2
forEach
map
filter
reduce
indexOf
end

其中包括 Array 原型函数,对吧?这绝对不是它应该工作的方式。这是为什么?

顺便说一句,当将循环更改为for (var key=0; key < categories.length, key++).

4

3 回答 3

2

for..in用于对象而不是数组。使用常规for循环:

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

for...in当您不关心索引但不建议使用时,它将适用于数组。您遇到的问题是因为for...in查找对象的所有属性,包括原型中的属性,这就是为什么建议始终检查属性是否实际上在对象中的原因。

for (var i in obj) {
    if (obj.hasOwnProperty(i)) {
        // do something
    }
}
于 2012-10-26T07:18:07.673 回答
2

那是因为您可能正在使用扩展Array.prototype. 它不会在其他浏览器中发生的原因是它们已经原生支持这些方法。由于 IE 不支持,所以有一些代码在 JS 中添加了它,这使得方法可以枚举。

for in这就是你不应该使用数组的原因之一。

另一个是不能保证迭代顺序的事实,for in尽管它在大多数浏览器中确实有效,但它被规范明确地保留为未定义的行为。John Resig 自己针对 chrome http://code.google.com/p/chromium/issues/detail?id=883提交了一个错误,它已关闭,因为无法修复,因为不需要订购属性

坚持使用标准循环

于 2012-10-26T07:21:11.903 回答
0

好像您使用了一些框架。迭代数组是不好的方法,因为一些框架向标准原型添加了功能。

 for (var i=0, len=arr.length; i<len; ++i) {

 }

该代码将在任何地方工作。

于 2012-10-26T07:20:46.067 回答