话说自打foreach出来后,for我就不怎么使用了。毕竟for能干的,foreach都可以干,而且foreach更加的简洁。
毕竟foreach回调函数的3个参数,基本可以解决所有问题。
以上,是我在leetCode上没有刷到这一题的观点。
这是一道简单的基础题,基本连审题带写,3-5分钟肯定可以搞定(搞不定的可以给我点个赞,以后就可以搞得定了)。
var moveZeroes = function (nums) {
nums.forEach((item,index,self) => {
if(item===0){
self.splice(index,1)
self.push(0)
}
});
return nums
};
点击leetCode的运行,一下通,好的提交,哎,问题来了:
输入:[ 0, 0, 3, 12 ]
本应输出:[ 3, 12, 0,0 ]
但输出:[ 0, 3, 12, 0 ]
看了上百秒,用人脑代替cpu跑了两圈,我觉得,是splice那里出现了问题。
在这里输出了一下item后,我发现根本循环就没有走第二个0:
也就是说,splice在index=0时删除掉第一个0,后,nums数组整体向前移动一个index,这时,原来index=1的0,变成了2,所以才会出现上面的情况。
但是foreach又不可以改变他的循环状态,所以,我换回了for:
var moveZeroes = function (nums) {
let length = nums.length
for (let i = 0; i < length;) {
if (nums[i] == 0) {
nums.splice(i, 1)
nums.push(0)
i = i
length-- //如果不-1,会陷入死循环
} else {
i++
}
}
};
在for循环里,我们可以控制i来到达控制循环状态的目的。
这就是为啥我觉得for比foreach要强的原因了。