for其实比foreach要强的

204 阅读1分钟

话说自打foreach出来后,for我就不怎么使用了。毕竟for能干的,foreach都可以干,而且foreach更加的简洁。

毕竟foreach回调函数的3个参数,基本可以解决所有问题。

以上,是我在leetCode上没有刷到这一题的观点。

image.png

这是一道简单的基础题,基本连审题带写,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:

image.png

也就是说,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要强的原因了。