需要解释:在JavaScript中用于…和(;;)时有不同的输出

需要解释:在JavaScript中用于…和(;;)时有不同的输出,javascript,node.js,for-loop,for-in-loop,Javascript,Node.js,For Loop,For In Loop,在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.

在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 ]
在第二个脚本中,我将循环中的..更改为(;)循环,如下所示:

#!/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);

虽然我的意图相同,但两个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…in
循环来迭代数组。详细说明这是一个坏主意。

不要在中使用
for…来迭代数组(或一般的集合)。同时迭代和删除不是一个好主意。为了更好地了解发生了什么,请将此
控制台.log('i=',i,'myarr=',myarr')放入其中之后的
for(myarr中的var i){
:“在任何枚举中,属性名称不得被访问超过一次。”。您在
for in
-循环中的
--i
是无效的(您可以使用
while
而不是
if
)。非常感谢您的解释。我知道我可以使用第二个数组来推奇数。但我想不使用任何其他数组。
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);
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);