为什么for ... in循环遍历函数名称

时间:2012-10-26 07:11:52

标签: javascript for-loop internet-explorer-8

在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++)时,它当然有效。

3 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:2)

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

这就是为什么不应该将for in与数组一起使用的原因之一。

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

坚持使用标准循环

答案 2 :(得分:0)

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

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

 }

该代码可以在任何地方使用。