[英]Explaination needed: Different outputs when used for…in and for(;;) in JavaScript
在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
循环来迭代数组。 这个答案详述了为什么这是一个坏主意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.