为什么这总是在数组[j] ??
的第一次迭代中打印UNDEFINEDvar 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]);
}
}
答案 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中的另一个。