ForEach循环是否允许使用break并继续?

use*_*695 12 javascript

是否ForEach环路允许我们使用breakcontinue

我尝试过使用两者但收到错误:

Illegal break/continue statement
Run Code Online (Sandbox Code Playgroud)

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

dje*_*lin 15

不,它不会,因为您将回调作为返回传递,它作为普通函数执行.

让我说清楚一下:

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]);
}
Run Code Online (Sandbox Code Playgroud)

所有forEach都会调用你重复给它的一个真实的实际函数,忽略它如何退出,然后在下一个元素上再次调用它.

在那个回调函数中,如果你返回它将顺便工作就像continueforEach.因为该函数的其余部分将不会执行该时间,并且将再次调用它.没有类似的break.

Ruby支持这种灵活性,使用块/ proc而不是methods/lambdas.

Per Mozilla的文档:

注意:无法停止或中断forEach循环.解决方案是使用Array.every或Array.some.见下面的例子.

every并且some完全相同forEach,除了他们注意回调的返回值.因为它们是短路的,所以会打破一个虚假的价值,every并且some会打破一个真正的价值.它们完全类似于&&||.&&测试是否所有的表达是truthy,||试验是否一定就是,这应该有助于你记住短路,如何处理everysome.如有疑问,请尝试一下.


Jon*_*enn 8

正如已经回答的那样,您不能在 JavaScript循环中使用continue或。但是,还有其他选择:breakArray.prototype.forEach

选项1

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

简单地return true继续,或return false打破循环。

选项 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) {
}
Run Code Online (Sandbox Code Playgroud)

预期的结果只是 1