javascript - JavaScript 中需要解释 : Different outputs when used for. ..in 和 for(;;)

标签 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.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]

为(;;)

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 循环遍历数组。 This answer详细说明为什么这是个坏主意。

关于javascript - JavaScript 中需要解释 : Different outputs when used for. ..in 和 for(;;),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27441799/

相关文章:

java - 在java中计算平均值

javascript - 通过NodeJS获取OPSkins价目表的平均价格

javascript - JavaScript 中的动态类型、扩展 Native 和 hasOwnProperty()

c++ - 为什么for循环的条件可以留空?

node.js - Rest API - 如何以正确的方式提供数据

mysql - 如何在特定情况下在 Sequelize 中获取关联元素

python - 使用 'for loop' 合并两个数组

javascript - 使用 jmespath 通过两个参数查找最小值和最大值

javascript - 为什么 ES6 代码和 ES5 代码用 Babel.js 编译后结果不一样?

json - Mongo JSON 文档 -> JSON -> BSON