ForEach循环是否允许使用break和continue ?

Does the ForEach loop allow using break and continue?

本文关键字:continue break 许使用 循环 是否 ForEach      更新时间:2023-09-26

ForEach循环允许我们使用breakcontinue吗?

我已经尝试使用两个,但我收到一个错误:

Illegal break/continue statement

如果允许,我如何使用它们?

不,它没有,因为你传递了一个回调作为返回,它作为一个普通函数执行。

让我说清楚:

var arr = [1,2,3];
arr.forEach(function(i) {
    console.log(i);
});
// is like
var cb = function(i) {
    console.log(i);
    // would "break" here do anything?
    // would "continue" here do anything?
    // of course not.
}
for(var j = 0; j < arr.length; j++) {
    cb(arr[j]);
}

所有forEach所做的就是调用一个真实的,实际的函数,忽略它如何退出,然后在下一个元素上再次调用它。

在该回调函数中,如果您返回它将顺便在forEach的情况下像continue一样工作。因为函数的其余部分不会执行,它会再次被调用。没有break.的类似物

Ruby支持这种灵活性,使用block/procs而不是method/lambdas。

根据Mozilla的文档:

注意:没有办法停止或中断forEach循环。解决方案是使用Array。every或Array.some。

everysomeforEach完全相同,除了它们关注回调的返回值。every会在假值时断开,some会在真值时断开,因为它们会短路。它们与&&||完全相似。&&测试每个表达式是否为真,||测试某些是否为真,这应该有助于您记住everysome的短路工作原理。

如前所述,您不能在JavaScript Array.prototype.forEach循环中使用continuebreak。但是,还有其他选项:

选项1

使用jQuery的.each()函数(参考)

只需return true to 继续,或者return false to 中断循环。

选项2

只需使用return继续throw new Error()中断。我并不一定推荐这样做,但知道这是可能的是很有趣的。

try {
    [1, 2, 3, 4].forEach(function(i) {
        if (i === 2) {
            return; // continue
        }
        if (i === 3) {
            throw new Error(); // break
        }
        console.log(i);
    });
}
catch (e) {
}

预期结果只是1