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

Javascript 对象中的循环与数组中的循环,javascript,Javascript,可能重复: 数组中的for循环应该像(var i=0;i

可能重复:


数组中的for循环应该像(var i=0;i那样编码,而对象中的循环只是(var i in foo){这是因为对象的设置方式与数组的设置方式不同吗?(我知道数组是一种对象btw)或者仅仅是另一个挑剔的编程约定。

好吧,主要原因是,
for…in
只迭代定义的成员

所以

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

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

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

一,

二,

三,

长度

托斯特林

等等


对于数组来说,使用典型的
for
语法是更好的选择。对于对象来说,中的
for…更有意义,因为未定义的问题不会经常出现。无论如何,我都喜欢使用
for(var x;x
语法。不过,在js中感觉更好。

您应该使用
for(i=0;实际上这不是一个很好的复制品,所以我会在另外80亿个复制品中寻找一个……半生不熟的小例子:这个问题本身并没有太多的重叠,但不可估量的T.J.Crowder的答案涵盖了所有的基础。@MaVRoSCy我不知道我是否误解了这一点,但说(或暗示)数组是对象的一种类型…@Kpower yes数组是对象,但它们是特殊的。而不是“过去”,for..in循环迭代对象的所有可枚举属性,包括其
[[Prototype]]
chain。数组的数字索引只是数组方法处理不同的数字对象属性。这不是奇怪的行为,这是意料之中的。@审美和被期待意味着它不可能也很奇怪?@RobG,是的,我知道。可能不是我最好的措辞,但信不信由你,我的想法是对的
var arr = [];
arr[10] = "hi";
for(var x in arr)
{
    alert(x);
}
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
obj = { 
  foo: 1,
  bar: 2
}
for(key in obj) {
  if(obj.hasOwnProperty(key)) {
    alert(key);       // foo, bar
    alert(obj[key]);  // 1, 2
  }
}