for对象中的循环与数组中的循环

时间:2012-08-16 22:41:27

标签: javascript

  

可能重复:
  JavaScript for…in vs for
  difference between for..in and for loops, and counter declaration

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

2 个答案:

答案 0 :(得分: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循环,因为可按键进行索引。如果您将对象视为键:值映射。请记住检查对象是否具有与每个键匹配的属性,因为in语句将检查对象的 proptotype链并返回从上面继承的属性名称

obj = { 
  foo: 1,
  bar: 2
}
for(key in obj) {
  if(obj.hasOwnProperty(key)) {
    alert(key);       // foo, bar
    alert(obj[key]);  // 1, 2
  }
}

答案 1 :(得分:-1)

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

所以,

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

仅显示 定义的一个值。有时这是件好事 - 通常不是。

此外,for...in遍历属性,而不是数组索引(在javascript中,数组只是一个常规对象,其属性的名称是您为数组赋值的值)

所以当你使用for..in时,你会得到奇怪的结果,比如:

1

2

3

长度

的toString

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