Javascript - For Loop key仅限于第一次迭代?

时间:2014-03-04 20:35:37

标签: javascript loops for-loop

为什么这总是在数组[j] ??

的第一次迭代中打印UNDEFINED
var array = [1,2,3,4,5]
for (i in array) {

    console.log("array[i]:" +array[i]);

    for (j=i+1; j<array.length-1;j++) {

        console.log("array[j]:"+ array[j]);
    }
}

4 个答案:

答案 0 :(得分:3)

那是因为i包含字符串值,而不是数字。

j设为i+1会使其成为"0"+1,而不是0+1,因此这是"01"。由于array中没有带有密钥"01"的项目,您将获得undefined

执行j++时,它会将"01"转换为数字1并增加它,以便循环将按预期运行到最后。

对于外部循环中的下一次迭代,得到j = "11",当将其与数组的长度进行比较时,它将跳过内部循环。对于外部循环中的其余迭代,将跳过内部循环,因为j将从数组外部开始。

答案 1 :(得分:1)

当您在数组上使用foreach语法时,实际上它将数组的索引作为字符串值拉入i变量。执行j = i + 1会将j变量设置为字符串值01,因为array中的该键没有相应的值,所以它返回undefined。

在子循环中的第一次迭代之后,j++会将其转换为整数并在数组的索引处返回正确的值。

有关您正在使用的foreach语法的详细信息,请参阅this question

答案 2 :(得分:1)

这是因为你在数组上使用for...in循环。使用for...in时,数组索引被视为散列键,因此被视为字符串。因此,当您开始第二个循环并将j设置为i + 1时,您确实将j设置为“01”。由于没有array["01"],因此第一次迭代时未定义。在第二次迭代时,通过将j设置为length - 1,可以将var array = [1,2,3,4,5] for (i in array) { console.log(typeof i); console.log("array[i]:" +array[i]); for (j=i+1; j<array.length-1;j++) { console.log(j); console.log("array[j]:"+ array[j]); } } 转换回数字,因此可以使用它来访问数组索引。试试这个例子:

for...in

解决这个问题的方法是不使用带有数组的for循环。只需坚持正常的while循环,当然还有do和{{1}}循环,无论情况如何。

答案 3 :(得分:0)

故事的其余部分

这是答案竞赛中的较晚参赛作品。

使用for..of

for ( var i of array)自动将Array“索引”强制转换为数字-因此,只需将“ in”替换为“ of”即可解决OP的问题

请勿使用for..in

JS文档说

  

注意:for ... in不应用于遍历索引顺序很重要的Array。

为什么?当前所有答案都表明问题在于“索引”实际上是字符串。那个怎么样?我们都知道“ for循环”使用数字并且有效。

JS Array不是数组,而是常规JS对象

JS数组实际上是变相的普通旧JS对象-Key:Value对,其中键(属性名称)始终是字符串。 Array没有真实的索引! “索引”只是名称是字符串数字的属性,因此“ 0”,“ 1”等。没有数字索引。但是您可以说Array是JS对象的特例-它使用无效的名称(以数字开头),并且JS允许我们像Array实际具有索引一样进行写操作。众多Javascript WTF中的另一个。