Javascript-For循环键仅在第一次迭代时未定义?
为什么数组[j]的第一次迭代总是打印未定义的Javascript-For循环键仅在第一次迭代时未定义?,javascript,loops,for-loop,Javascript,Loops,For Loop,为什么数组[j]的第一次迭代总是打印未定义的 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]); } } var数组=[1,2,3,4,5] for(数组中的i){ log(“数组[i]:”+ar
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]);
}
}
var数组=[1,2,3,4,5]
for(数组中的i){
log(“数组[i]:”+array[i]);
对于(j=i+1;j在数组上使用foreach
语法时,实际上是将数组的索引作为字符串值拉入i
变量。执行j=i+1
将j
变量设置为字符串值01
,在数组中的该键处没有相应的值所以它返回undefined
在子循环中的第一次迭代之后,j++
将其转换为整数,并在数组的索引处返回正确的值
有关正在使用的foreach
语法的更多信息,请参阅。在数组上使用foreach
语法时,它实际上是将数组的索引作为字符串值拉入i
变量。执行j=i+1
将j
变量设置为字符串值01
,在数组
中的该键处没有相应的值,因此它返回未定义的
在子循环中的第一次迭代之后,j++
将其转换为整数,并在数组的索引处返回正确的值
有关所使用的foreach
语法的详细信息,请参阅。这是因为在数组上使用for…in
循环。当使用for…in
时,数组索引被视为散列键,因此被视为字符串。因此,当开始第二个循环并将j
设置为i+1,您确实已将j
设置为“01”。由于没有数组[“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]);
}
}
var数组=[1,2,3,4,5]
for(数组中的i){
控制台日志(类型i);
log(“数组[i]:”+array[i]);
对于(j=i+1;j这是因为您在数组上使用for…in
循环。当您在中使用for…in
时,数组索引被视为散列键,因此被视为字符串。因此,当您开始第二个循环并将j
设置为i+1
时,您实际上已将j
设置为“01”。由于没有数组[“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]);
}
}
var数组=[1,2,3,4,5]
for(数组中的i){
控制台日志(类型i);
log(“数组[i]:”+array[i]);
对于(j=i+1;j这是因为i
包含字符串值,而不是数字
将j
设置为i+1
使其“0”+1
,而不是0+1
,即“01”
。由于数组中没有带有键“01”
的项,因此返回未定义的
当执行j++
时,它将“01”
转换为数字1
,并将其增加,这样循环将按预期运行到底
对于外部循环中的下一次迭代,您将得到j=“11”
,当与数组的长度进行比较时,它将跳过内部循环。对于外部循环中的其余迭代,将跳过内部循环,因为j
将从数组外部开始。这是因为i
包含字符串值,而不是数字
将j
设置为i+1
使其“0”+1
,而不是0+1
,即“01”
。由于数组中没有带有键“01”
的项,因此返回未定义的
当执行j++
时,它将“01”
转换为数字1
,并将其增加,这样循环将按预期运行到底
对于外循环中的下一次迭代,您将得到j=“11”
,当与数组长度进行比较时,它将跳过内循环。对于外循环中的其余迭代,将跳过内循环,因为j
将从数组外部开始。故事的其余部分
这是答题比赛的最后一项
将用于..of
for(vari of array)
自动将数组
的“索引”强制为数字-,因此只需将“in”替换为“of”
在
JS文档说
注意:for…in不应用于迭代索引顺序很重要的数组
为什么?目前所有的答案都说问题在于“索引”实际上是字符串。这是怎么回事?我们都知道“for循环”使用数字,这是有效的
JSArray
s不是数组,而是常规JS对象
JS数组实际上是一个普通的伪装的旧JS对象-键:值对,其中键(属性名称)始终是字符串。数组没有真正的索引。的“索引”只是属性,而属性的名称是字符串数字,所以“0”、“1”,等等。没有数字索引。但是你可以说,Array
是JS对象的一个特例-它使用无效名称(以数字开头),JS允许我们编写,就好像Array
实际上有索引一样。这只是众多Javascript WTF中的另一个。故事的其余部分
这是答题比赛的最后一项
将用于..of
for(数组的变量i)
自动强制数组