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

时间:2014-03-22 23:27:11

标签: javascript

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

我尝试过使用这两种方法,但收到了错误:

Illegal break/continue statement

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

2 个答案:

答案 0 :(得分:13)

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

让我说清楚:

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都会调用你重复给它的真实的,实际的函数,忽略它是如何退出的,然后再次在下一个元素上调用它。

在该回调函数中,如果您返回,则在continue的情况下偶然会像forEach一样工作。因为该函数的其余部分将不会执行该时间,并且将再次调用它。没有break.

的类似物

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

Mozilla's documentation

  

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

everysomeforEach完全相同,只是它们注意回调的返回值。 every会打破假名值,some会突破真值,因为它们会短路。它们与&&||完全相似。 &&测试每个表达式是否真实,||测试是否某些,这应该可以帮助您记住短路是如何与{{{ 1}}和every。如有疑问,请试试。

答案 1 :(得分:3)

如前所述,您无法在JavaScript continue循环中使用breakArray.prototype.forEach。但是,还有其他选择:

选项1

使用jQuery .each()函数(Reference)。

只需return true 继续,或return false 打破循环。

选项2

只需使用return 继续throw new Error() break 即可。我不一定建议这样做,但知道这是可能的,这很有趣。

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