需要解释:用于时输出不同.in and for(;;) in JavaScript.

Explaination needed: Different outputs when used for...in and for(;;) in JavaScript

本文关键字:in and JavaScript for 解释 用于 输出      更新时间:2023-09-26

在 NodeJS 中,我创建了以下两个脚本,它们都旨在从数组中删除偶数。

这是我的第一个脚本:

#!/usr/bin/nodejs
var myarr = [2,3,5,1,6,2,28,5,7,90,3];
console.log(myarr);
for(var i in myarr){
        if(myarr[i] % 2 == 0){
                myarr.splice(i,1);
                --i;
        }
}
console.log(myarr);

第一个脚本的输出如下:

[ 2, 3, 5, 1, 6, 2, 28, 5, 7, 90, 3 ]
[ 3, 5, 1, 2, 5, 7, 3 ]

在第二个脚本中,我将循环更改为for..in循环for(;;)如下所示:

#!/usr/bin/nodejs
var myarr = [2,3,5,1,6,2,28,5,7,90,3];
console.log(myarr);
for(var i=0;i<myarr.length;i++){
        if(myarr[i] % 2 == 0){
                myarr.splice(i,1);
                --i;
        }
}
console.log(myarr);

我得到了第二个脚本的以下输出:

[ 2, 3, 5, 1, 6, 2, 28, 5, 7, 90, 3 ]
[ 3, 5, 1, 5, 7, 3 ]

虽然我的意图是相同的,但两个 for 循环给了我不同的输出。我发现,在我的第一个脚本中,如果原始数组中存在两个相邻的偶数,则if条件似乎只适用于跳过第二个偶数的第一个偶数。如果有人能清楚地解释这种差异,我将不胜感激。

你做的是错的。您将在循环访问同一数组时从数组中删除键。您的 for...in 循环只会执行 7 次迭代,因为您的 4 个键是在数组仍在迭代时从数组中拼接出来的,而您的 for(;;) 循环将始终执行所有 11 次迭代,如开头 (myarr.length) 所定义的那样。

您应该定义第二个数组以用于结果:

为。。。在

var myarr = [2,3,5,1,6,2,28,5,7,90,3],
    resultarr = [];
console.log(myarr);
for(var i in myarr){
    if(myarr[i] % 2 != 0){
        resultarr.push(myarr[i])
    }
}
console.log(resultarr);
-> [3, 5, 1, 5, 7, 3]

for(;;)

var myarr = [2,3,5,1,6,2,28,5,7,90,3],
    resultarr = [];
console.log(myarr);
for(var i=0;i<myarr.length;i++){
    if(myarr[i] % 2 != 0){
        resultarr.push(myarr[i]);
    }
}
console.log(resultarr);
-> [3, 5, 1, 5, 7, 3]

作为结束说明,无论如何都不应该使用 for...in 循环来迭代数组。这个答案详细说明了为什么这是一个坏主意。