一、forEach()中的return与for循环中的return一样吗?
下面是一个小实践的例子:
let arr = ['1','2','3','4'];
arr.forEach((item) => {
console.log("foreach",item);
if (item === '2') {
return ;
}
});
for (let i = 0; i < 4; i++) {
console.log("arr",arr[i]);
if (arr[i] === '2') {
return ;
}
}
// 输出结果
/*foreach 1
*foreach 2
*foreach 3
*foreach 4
*arr 1
*arr 2
*/
通过输出结果可知,两个是不一样的(因为输出结果都不一样)
那么拓展一下,使用break会怎么样?
forEach():
let arr = ['1','2','3','4'];
arr.forEach((item) => {
console.log("foreach",item);
if (item === '2') {
break ; // 会报错
}
});
for():
let arr = ['1','2','3','4'];
for (let i = 0; i < 4; i++) {
if (arr[i] === '2') {
break ;
}
console.log("arr",arr[i]);
}
/*
* arr 1
* arr 2
*/
可以看到forEach()中使用break会报错,在for()中使用break与return效果一样,都是直接跳出循环,但是要使用return,for循环必须在一个函数中
二、有什么区别
- forEach()中的return只会结束此次循环,执行下一次循环
- for中的return会直接跳出循环,不再执行下面的循环
三、如何在forEach()中直接退出循环
使用try{} catch() {} 捕获异常实现:
let arr = ['1','2','3','4'];
try {
arr.forEach((item) => {
if (item === '2') {
throw new Error("退出循环");
}
console.log("foreach",item);
});
} catch (e) {
if (e.message === "退出循环") {
console.log("结束了");
} else {
console.log(e.message);
}
}
/*
*foreach 1
*结束了
*/
或者使用 some 或者 every 代替 forEach:
- some:对数组中每一项运行给定函数,只要有一项返回true,就会跳出循环,函数返回true ;
- every:对数组中每一项运行给定函数,只要每一项都返回true,函数返回true ,所以只要有一项不是true就会退出循环;
let flag = arr.some((item) => {
console.log("arr",item);
if (item === '2') {
return true;
}
});
console.log(flag);
/*
*arr 1
*arr 2
*true
*/
let flag = arr.every((item) => {
console.log("arr",item);
if (item !== '2') {
return true;
}
});
console.log(flag);
/*
*arr 1
*arr 2
*false
*/