需要说明:在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”我猜这是行不通的。