在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++)
时,它当然有效。
答案 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) {
}
该代码可以在任何地方使用。