-1

可能重复:
JavaScript for...in vs for
for..in 和 for 循环之间的区别,以及计数器声明

是否有任何特殊原因应该像数组中的 for 循环那样编码,for (var i = 0; i < foo.length; i++) {而对象中的循环只是for (var i in foo) {因为对象的设置方式与数组的设置方式?(我知道数组是一种对象顺便说一句)或者只是另一个挑剔的编程约定。

4

2 回答 2

2

迭代列表时应该使用for(i=0; i<n; i++)循环,因为它们可以按整数索引

arr = [1,2,3,4]; // arr[0] == 1; arr[1] == 2;
for(var i=0; i<arr.length; i++) { alert(arr[i]; } // 1, 2, 3, 4

for...in迭代对象时应该使用循环,因为它可以按键索引。如果您将对象视为键:值映射。请记住检查对象是否具有与每个 key 匹配的自己的属性,因为该in语句将检查对象的proptotype 链并返回从上面继承的属性名称。

obj = { 
  foo: 1,
  bar: 2
}
for(key in obj) {
  if(obj.hasOwnProperty(key)) {
    alert(key);       // foo, bar
    alert(obj[key]);  // 1, 2
  }
}
于 2012-08-16T22:59:53.860 回答
-1

嗯,主要原因是因为for...in只迭代定义的成员。

所以,

var arr = [];
arr[10] = "hi";
for(var x in arr)
{
    alert(x);
}

只会显示定义的一个。有时这是一件好事——通常不是。

此外,for...in循环遍历属性,而不是数组索引(在 javascript 中,数组只是一个具有属性的常规对象,其名称是您分配给数组的值)

因此,当您使用 for..in 时,您会得到奇怪的结果,例如:

1

2

3

长度

等等

使用典型for语法只是数组的更好选择。对于对象,这for...in更有意义,因为未定义的问题不会经常出现。不过,无论哪种方式,我都喜欢使用for(var x; x < y; x++)语法。只是感觉在js中更好。

于 2012-08-16T22:49:07.050 回答