Javascript为什么FOR IN是一个不好的做法?

Javascript why FOR IN is a bad practice?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
JavaScript “For …in” with Arrays

人们总是告诉我使用for-in是个坏习惯,你能告诉我为什么吗?为什么和我一起使用更好?

我一直喜欢在中使用,因为我也使用PHP,我经常使用foreach,这与在javascript中的for非常相似。


坏的做法是不理解枚举数组对象和迭代数组对象之间的区别。否则,for...in循环是很好的工具。内部差异很大,但我会尽量用实际的方式解释:

语法为:for (string in object),其中objectobject的一个实例(当然还有它的任何后代),stringvar在每个循环迭代中接收object的属性名。但是以东十一〔六〕也是以东十一〔二〕的后代!因此,使用:

1
2
3
4
var array = [0,1,2];
for (var property in array)
  alert(typeof property + '\t' + property + '
'
+ typeof array[property] + '\t' + array[property]);

但根本没有意义。此外,请注意[]上方的括号符号。这是成员资格运算符的一种形式,不能与数组元素访问混淆。第一个需要string和第二个number类型的操作数。让我们打破上面的例子,用var array = new Array(3)创建数组。循环不再工作,但array.length == 3正确。

结论:对数组以外的任何对象使用for...in。将for (var number = 0; number < array.length; number++)与数组一起使用。

顺便说一下,javascript对象与PHP的关联数组(如果坚持使用正确的术语,则为哈希表)类似。语法是var object = {string:value,anotherName:moreStuff}。在这里,for...in很方便!

进一步阅读