1、forEach 退出循环

forEach 方法是 JavaScript 数组对象内置的一个迭代器,它遍历数组中的每一个元素并执行一定的函数操作。由于 forEach 方法是自动遍历整个数组,因此无法通过 break 或 return 语句退出循环。也就是说forEach() 方法是用于遍历数组的,而不是用来执行循环的,所以它没有办法让你像普通的循环一样控制流程。

以下是四种跳出 forEach 循环的方法及示例:

(1) throw new Error()

通过抛出异常的方式,强制退出整个 forEach 循环。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
try {
[1, 2, 3, 4, 5].forEach(function(item) {
if (item === 3) {
throw new Error('exit')
}
console.log(item)
})
} catch (e) {
if (e.message !== 'exit') {
throw e
}
}

// 输出
1
2
e:\Users\Allen's hp\Desktop\tempCodeRunnerFile.js:3
throw new Error('exit')

(2)return + 变量

return 语句只能跳出本次迭代,无法完全退出循环,数组会继续迭代直到结束,因此无法完全退出循环。

1
2
3
4
5
6
7
8
9
10
11
12
[1, 2, 3, 4, 5].forEach(function(item) {
if (item === 3) {
return
}
console.log(item)
})

// 输出
1
2
4
5

但是可以通过一个变量来保证满足条件时不再继续往下走

1
2
3
4
5
6
7
8
9
10
11
12
let isBreak = false;
[1, 2, 3, 4, 5].forEach((item) => {
if (isBreak || item === 3) {
isBreak = true;
return;
}
console.log(item);
});

// 输出
1
2

(3)some

some 方法是 ECMAScript 5 新增的数组方法,它可以在遍历数组时返回 true 或 false,来控制是否继续遍历。如果 some 方法的回调函数返回 true,就会停止遍历。

1
2
3
4
5
6
7
8
9
10
11
[1, 2, 3, 4, 5].some(function(item) {
if (item === 3) {
return true
}
console.log(item)
return false
})

// 输出
1
2

请注意,虽然有以上退出 forEach 循环的方法,但是并不建议在 forEach 循环中使用它们,因为这种做法可能会导致代码出现异常,或者增加代码的复杂度,不够简洁。如果需要遍历数组并在一定条件下停止遍历,建议使用其他的循环语句,如 for、for of 或 while 循环。

2、continue、break、return区别

(1) continue: 跳出本地循环,进入下一次循环

1
2
3
4
5
6
for(let i = 0; i < 5; i++) {
if(i == 3) {
continue;
}
console.log(i); // 0,1,2,4
}

(2) break:跳出当前循环(如为多层循环,不影响外层循环)

1
2
3
4
5
6
for(let i = 0; i < 5; i++) {
if(i == 3) {
break;
}
console.log(i); // 0,1,2
}

(3) return:结束当前函数调用

所以不能在for循环中使用

3、总结

(1)forEach是一个迭代器,所以无法使用break或continue等来控制循环流程的操作来终止循环。可以通过every或some这类来实现满足条件后终止循环。

(2)continue为跳过本次循环,进入下一次循环。break为跳出当前循环,如果有多层循环,不影响外层循环。return为结束当前函数调用,所以for循环中不能使用return。