Does the ForEach
loop allow us to use break
and continue
?
I\'ve tried using both but I received an error:
Illegal
As already answered, you cannot use continue
or break
inside a JavaScript Array.prototype.forEach
loop. However, there are other options:
Use the jQuery .each()
function (Reference).
Simply return true
to continue, or return false
to break the loop.
Just use return
to continue or throw new Error()
to break. I don't necessarily recommend doing it this way, but it's interesting to know that this is possible.
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) {
}
The expected result is just 1
No, it doesn't, because you pass a callback as a return, which is executed as an ordinary function.
Let me be clear:
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]);
}
All forEach does is call a real, actual function you give to it repeatedly, ignore how it exits, then calls it again on the next element.
In that callback function if you return it will incidentally work like continue
in the case of forEach
. Because the rest of the function won't execute that time, and it will be called again. There is no analogue of break.
Ruby supports this flexibility, using blocks/procs instead of methods/lambdas.
Per Mozilla's documentation:
Note : There is no way to stop or break a forEach loop. The solution is to use Array.every or Array.some. See example below.
every
and some
are exactly like forEach
, except they pay attention to the return value of the callback. every
will break on a falsey value and some
will break on a truthy value, since they shortcircuit. They are exactly analogous to &&
and ||
. &&
tests whether every expression is truthy, ||
tests for whether some is, which should help you remember how short-circuiting works with every
and some
. When in doubt, try it.