我们都知道在for循环中,退出循环有3种方式:return(终止)、break(退出整个循环)、continue(退出当次循环)。
但是如果使用forEach方法,但很容易遇到一个问题就是,当你想要跳出这个循环时,上面的方式好像不起作用了,除了return(且return在forEach()中相当于continue)。
举个例子
let list = [0,1,2,3,4,5,6,7,8,9];
list.forEach(function(item){
console.log(item);
if (item > 5 ){
return;
}
});
输出结果是0,1,2,3,4,5,6,7,8,9。并没有在大于5的时候终止循环。
如果把return替换为break会报错:Uncaught SyntaxError: Illegal break statement。这是为什么呢,在V8的源码里找了又找也没有找到forEach函数的源码,从其他实现的forEach中也能发现一些端倪。
Array.prototype.myEach = function(callback) {
for (var i = 0; i < this.length; i++)
callback(this[i], i, this);
};
在回调函数中使用return,只是将结果返回到上级函数,也就是这个for循环中,并没有结束for循环,所以return也是无效的。
所以如果有面试官或者有人问你foreach怎么跳出循环,请你大声的告诉ta,跳不出!
在forEach的设计中并没有中断循环的设计,但是可以通过try{}catch(){}结合throw抛错的方式终止循环:
try {
[1,2,3,4,5].forEach((item) => {
if (item > 5) throw new Error('退出forEach循环!')
console.log(item)
})
} catch(e) {
console.log(e)
}
但在实际开发中,不推荐这样使用。这是由于try-catch包裹时,当循环体过大性能会随之下降,这是无法避免的,所以抛出异常只是作为一种中断forEach的手段而已。
除抛出异常之外,没有其他方法可以终止循环。如果您需要这种行为,则该forEach()方法是错误的工具,请使用其他方式。
4 天前