这个问题,源自于工作中的一个惨案,误用foreach()循环的跳出条件。流汗~~~
JS中的循环方法有多少种?
- for:普通for循环,不用多讲了,下面说一下,如何退出循环。 结论:只是想跳出本次循环使用continue,跳出整个循环体使用break,中止函数使用return。
//方案一:使用break , 会直接跳出该循环语句,若有多重循环,也会直接跳出。
//结果:0 1 2 3 'function end'
function test_01() {
for (let i = 0; i < 10; i++) {
if (i > 3) {
break;
}
console.log(i);
}
console.log( 'function end' );
}
//方案2:使用return, 跳出循环,终止函数执行,立即返回结果;
//结果:0 1 2 3
function test_02() {
for (let i = 0; i < 10; i++) {
if (i > 3) {
return;
}
console.log(i);
}
console.log( 'function end' );
}
//方案3:使用continue,注意:只会跳出本次循环,并不会把整个循环退出,示例如下
//结果:0 1 2 4 5 6 7 8 9 function end
function test_03() {
for (let i = 0; i < 10; i++) {
if (i === 3) {
continue;
}
console.log(i);
}
console.log( 'function end' );
}
- for...in:以任意顺序遍历一个对象的除Symbol以外的可枚举类型属性,包括继承的可枚举属性。(用人话说,它是为遍历对象属性而生的,其他情况慎用。提示:for...in不应该用于迭代一个关注索引顺序的Array.)
//退出循环情况,同普通for
function test_05() {
var obj = {a:1, b:2, c:3};
for (var prop in obj) {
console.log("obj." + prop + " = " + obj[prop]);
}
console.log('function end');
}
- for...of:可以在可迭代对象(如:Array, Map, Set, String, TypedArray, arguments对象等)上创建一个可迭代循环,调用自定义迭代钩子,并为每个不同的值执行语句。(用人话说,它与for...in最大的区别在于,他是用来遍历可迭代对象的value的。)
//退出循环情况,同普通for
function test_07() {
const array1 = ['a', 'b', 'c'];
for (const element of array1) {
console.log(element);
}
console.log('function end');
}
- forEach:方法对数组的每个元素执行一次给定的函数。
function test_08(){
const array1 = ['a', 'b', 'c'];
array1.forEach(element => console.log(element));
}
//以下是我犯的错:
function test_09(){
const array1 = ['a', 'b', 'c'];
//我想当遍历到值为‘b’时,退出循环。
array1.forEach( element => {
if ( element==='b' ) return;
console.log(element);
} );
}
//打印结果: 'a' 'c', 预期的是: 只打印'a'
看了以上的代码,我相信大家已经有答案了。首先,forEach传入的函数中,是不能使用break,continue的,其次,我们也不能使用return达到目的。因为return只能,提前终止当前的函数,而不能把整个forEach语句给终止。
带着这个问题,我去看了一下,MDN官方文档:描述的很清楚!
至于,提到的抛出异常的方案如下,但通常我们不会使用, 抛出异常的方式终止一个循环,多少有点怪!。
//结果为: 'a' Error: 出错啦! 'function end'
function test_10(){
const array1 = ['a', 'b', 'c'];
try{
array1.forEach( element => {
if ( element==='b' ) throw new Error('出错啦!');
console.log( element );
} );
} catch( err ){
console.log( err );
}
console.log('function end');
}
完结! 2021.11.15