Javascript 为什么for…in循环遍历函数名

Javascript 为什么for…in循环遍历函数名,javascript,for-loop,internet-explorer-8,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 其中包括阵列原型功能,对吗?这绝对不是它应该工作的方式。为什么呢 顺便说一句,将循环更改为for(var k

在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
其中包括阵列原型功能,对吗?这绝对不是它应该工作的方式。为什么呢


顺便说一句,将循环更改为
for(var key=0;key
for..in
用于对象而不是数组时,它当然会起作用。对循环使用常规的

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

你似乎在使用某种框架。 迭代数组是一种不好的方法,因为有些框架向标准原型添加了功能

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

 }

for(var i=0,len=arr.length;i这是因为您可能正在使用一个扩展了
Array.prototype
的库。在其他浏览器中不会发生这种情况的原因是,它们本机已经支持这些方法。由于IE不支持它,所以有一些代码在JS中添加了它,这使得这些方法可以枚举

这就是为什么不应该在
中对数组使用
for的原因之一

另一个事实是,
for in
不能保证迭代的顺序,尽管它在大多数浏览器中都能工作,但规范明确地将其作为未定义的行为。John Resig自己对chrome提出了一个bug,并且关闭了它,因为它不会修复,因为不需要对属性进行排序


坚持使用标准循环

for…in
表示法对对象的属性进行迭代。请看MDN上的第二条警告:感谢大家如此快速地回答并解决了问题!如果您不想查看继承的属性,建议您这样做。
for..in
是JS的一部分从JS 1()开始的pec我知道。但是如果你能保证没有人会改变array.prototype,那么就可以使用“for in”数组迭代。我认为这是不安全的。你说“虽然它不工作”是什么意思?它工作了,但是,它列举了无序的属性,正如你所描述的。我也不认为这是什么意思“使方法可枚举”,默认情况下,添加到数组中的所有方法都可枚举。@Nappy,我不知道你在说什么。我说过,在大多数浏览器中,它确实有效(按正确的顺序迭代)。如果您自己添加属性,它们将是可枚举的,但本机方法不是可枚举的。啊,很抱歉,这是语言问题,您的意思是“大多数浏览器都是这样工作的”。您对的使用让我很困惑:)@Nappy你对某物的使用让我困惑…我们现在不使用IM说话。我仍然不知道你的观点是什么,你不知道“它确实有效”是指按正确的顺序在数组上迭代?
 for (var i=0, len=arr.length; i<len; ++i) {

 }