JS的几种For循环介绍,以及在达到某种条件时,跳出循环?

272 阅读2分钟

这个问题,源自于工作中的一个惨案,误用foreach()循环的跳出条件。流汗~~~

JS中的循环方法有多少种?

  1. 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' );
}

  1. 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');
}
  1. 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');
}
  1. 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官方文档:描述的很清楚!

image.png 至于,提到的抛出异常的方案如下,但通常我们不会使用, 抛出异常的方式终止一个循环,多少有点怪!。

//结果为: '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