Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript-For循环键仅在第一次迭代时未定义?_Javascript_Loops_For Loop - Fatal编程技术网

Javascript-For循环键仅在第一次迭代时未定义?

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

为什么数组[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]:”+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循环”使用数字,这是有效的

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


JS数组实际上是一个普通的伪装的旧JS对象-键:值对,其中键(属性名称)始终是字符串。
数组没有真正的索引。
的“索引”只是属性,而属性的名称是字符串数字,所以“0”、“1”,等等。没有数字索引。但是你可以说,
Array
是JS对象的一个特例-它使用无效名称(以数字开头),JS允许我们编写,就好像
Array
实际上有索引一样。这只是众多Javascript WTF中的另一个。

故事的其余部分

这是答题比赛的最后一项

用于..of

for(数组的变量i)
自动强制
数组