在 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 原型(prototype)函数,对吗?这绝对不是它应该工作的方式。这是为什么?
顺便说一句,当将循环更改为 for (var key=0; key < categories.length, key++)
时它当然有效.
最佳答案
那是因为您可能正在使用扩展 Array.prototype
的库。它不会在其他浏览器中发生的原因是它们已经原生支持这些方法。由于IE不支持,所以有一些代码在JS中添加它,使方法可枚举。
这就是为什么你不应该对数组使用 for in
的原因之一。
另一个事实是 for in
不保证迭代的顺序,虽然它在大多数浏览器中都有效,但它被规范明确地保留为未定义的行为。 John Resig 自己提交了一个针对 chrome 的错误 http://code.google.com/p/chromium/issues/detail?id=883它已关闭,因为无法修复,因为不需要订购属性
坚持使用标准循环
关于javascript - 为什么 for...in 循环遍历函数名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13082409/