是否ForEach环路允许我们使用break和continue?
我尝试过使用两者但收到错误:
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都会调用你重复给它的一个真实的实际函数,忽略它如何退出,然后在下一个元素上再次调用它.
在那个回调函数中,如果你返回它将顺便工作就像continue在forEach.因为该函数的其余部分将不会执行该时间,并且将再次调用它.没有类似的break.
Ruby支持这种灵活性,使用块/ proc而不是methods/lambdas.
Per Mozilla的文档:
注意:无法停止或中断forEach循环.解决方案是使用Array.every或Array.some.见下面的例子.
every并且some完全相同forEach,除了他们注意回调的返回值.因为它们是短路的,所以会打破一个虚假的价值,every并且some会打破一个真正的价值.它们完全类似于&&和||.&&测试是否所有的表达是truthy,||试验是否一定就是,这应该有助于你记住短路,如何处理every和some.如有疑问,请尝试一下.
正如已经回答的那样,您不能在 JavaScript循环中使用continue或。但是,还有其他选择:breakArray.prototype.forEach
使用 jQuery.each()函数(参考)。
简单地return true以继续,或return false以打破循环。
只要使用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