先看下面这段代码:
在for循环中想要调出整个循环是break;但是在forEach中使用break不仅不能调出整个循环,还会报错,使用return也不行;
其实这个问题是由一道编程题引发的,使用循环判断数组中是否包含某个值;当我想用forEach来循环时,发现在找到该值之后没法提前调出循环,就会造成时间复杂度的浪费,增加冗余计算,除了用for循环语句来代替forEach,还有什么解决方法呢,forEach究竟怎么跳出循环。
1、使用try...catch来调出循环
当判断条件满足时,抛出异常,编码如下:
try{
let list = [1, 2, 3, 4, 5];
list.forEach(el => {
console.log(el);
if(el ==3 ) {
throw new Error('finish');
}
})
}catch(e) {
if(e.message == 'finish') {
console.log('All finish!');
}else {
console.log(e.message);
}
}
实际执行结果如下:
下面就继续看一下其他几个循环方法:
2、every()使用return false 跳出循环(需要配合return true使用)
语法糖:every()返回一个boolean,判断每个元素是否符合func条件。数组里面所有的元素都符合才返回true。
具体代码如下:
let func = () => {
let list = [1, 2, 3, 4, 5];
list.every(el => {
if(el == 3) {
console.log(el);
return false;
}else {
console.log(el);
return true;
}
})
}
func();
执行结果如图:
3、some()使用return true跳出循环
语法糖:some()返回一个boolean,判断是否有元素是否符合func条件。数组里面所有的元素有一个符合条件就返回true。
具体代码如下:
let func = () => {
let list = [1, 2, 3, 4, 5];
list.some(el => {
console.log(el);
if(el == 3) {
return true;
}
})
}
func();
执行结果如图:
4、map()
语法糖:map()返回一个新的Array,每个元素为调用func的结果。新数组的长度和原来的是一样的,他只不过是逐一对原来数据里的每个元素进行操作。
map相对来说比较特殊,先看代码执行结果:
使用return true:
使用return false:
使用break:
由以上结果可以看出:map 有返回值,返回一个新的数组,每个元素为调用func的结果。不能终止循环,使用 break 会报错,使用 return false;, 输出结果中会有 false,循环不会终止。