需要说明:在JavaScript中用于…和for(;;)时会有不同的输出

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

这是我的第一个脚本:

#!/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条件似乎只适用于第一个偶数,只有第二个偶数被跳过。 如果有人能够清楚地解释这种差异,我将不胜感激。

你在做什么是错的。 您正在从arrays中删除键,同时循环通过相同的数组。 你的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循环遍历数组。 这个答案详细说明了这是一个坏主意。

可能是因为在数组中有两个“2”的实例。

对于(var我myarr)< – 这只是循环遍历你我有你的数组,因为你有两个“2”我猜这是行不通的。