借助label,在多重循环时任意跳出;

68 阅读2分钟

前言:

很多初入it的小白,或者经历很少的同事,很多时候都只是掌握了基本的语法,比如for循环,大家都会用;很久前,一次面试时,突然遇见一道面试题,首先让介绍return和break的区别;其次就是请说出怎么实现在多重循环时,满足一定的条件就结束指定的某层循环,或者结束整个循环;但是当年学习的时候,老师也只是简单的介绍了break可以整个循环,但是没有言明break不能结束多重嵌套循环呀;当时很自信的说出break就是结束整个循环,斩钉截铁的态度,顿时逗笑了面试官;面试官也只是笑笑不说话(这个小白,怕是都没写过循环的嵌套吧)。
刚好今天想起了这件事,就简单的给介绍下for循环的label用法吧;

break的作用;

break其实就是终止该代码块的运行;简单来说,就是结束{}内的代码;无论是for循环,还是case中,都是结束该代码块的执行;

break在for循环中的作用;

break在for循环中的作用其实很简单,就是结束该for循环,一半在for循环中提到break时也会提到continue;它们俩的作用很相似,但是又有很大的区别;break是结束整个循环,而continue是跳过本次循环;

// break

for(let k = 0; k < 5; k++){
    // 如果k为3时结束循环,此时就要用到break;
    if(k === 3)break;
    console.log('第',k,'次');
}

// 输出 0,1,2

// continue

for(let k = 0; k < 5; k++){
    // 如果k为3时跳过本次循环,此时就要用到continue;
    if(k === 3)continue;
    console.log('第',k,'次');
}

// 输出0,1,2,4

总结:break是结束整个循环,结束整个循环代码块;而continue只是跳过本次循环,不在执行continue之后的代码,然后开始下次循环,直至循环结束;

for循环双重使用

// 当循环多层次嵌套的时候,break和continue都只能结束(跳过)最近的一次循环;、

for(let k = 0;k < 5;k++){
    for(let j = 0;j < 5;j++){
        if(k===3&&j===3)break;
        console.log('k=',k,';j=',j)
    }
}
// 输出 
// k= 0 ;j= 0
// k= 0 ;j= 1
// k= 0 ;j= 2
// k= 0 ;j= 3
// k= 0 ;j= 4
// k= 1 ;j= 0
// k= 1 ;j= 1
// k= 1 ;j= 2
// k= 1 ;j= 3
// k= 1 ;j= 4
// k= 2 ;j= 0
// k= 2 ;j= 1
// k= 2 ;j= 2
// k= 2 ;j= 3
// k= 2 ;j= 4
// k= 3 ;j= 0
// k= 3 ;j= 1
// k= 3 ;j= 2
// 这里并没有继续输出k=3,j=3;k=3,j=4...因为已经结束了本次内循环了,所以并不会继续输出;而是直接开始下次循环
// k= 4 ;j= 0
// k= 4 ;j= 1
// k= 4 ;j= 2
// k= 4 ;j= 3
// k= 4 ;j= 4

/** 可以很清晰的看见,break只是结束了当内层的j循环,但是外层循环并没有结束,所以代码还会继续下次循环,然后再次开启内循环;**/


for(let k = 0;k < 5;k++){
    for(let j = 0;j < 5;j++){
        if(k===3&&j===3)continue;
        console.log('k=',k,';j=',j)
    }
}
// 输出
// k= 0 ;j= 0
// k= 0 ;j= 1
// k= 0 ;j= 2
// k= 0 ;j= 3
// k= 0 ;j= 4
// k= 1 ;j= 0
// k= 1 ;j= 1
// k= 1 ;j= 2
// k= 1 ;j= 3
// k= 1 ;j= 4
// k= 2 ;j= 0
// k= 2 ;j= 1
// k= 2 ;j= 2
// k= 2 ;j= 3
// k= 2 ;j= 4
// k= 3 ;j= 0
// k= 3 ;j= 1
// k= 3 ;j= 2
// 跳过本次输出:k=3,j=3;
// k= 3 ;j= 4
// k= 4 ;j= 0
// k= 4 ;j= 1
// k= 4 ;j= 2
// k= 4 ;j= 3
// k= 4 ;j= 4

/** 这里的输出就很完整,只是跳过了一次内层循环,跳过k=3,j=3;这一次 **/

label的应用;

既然break不能结束整个多重循环,但是开发中很多时候就需要满足特定的条件就结束整个循环的,或者满足一定的需求就结束特定某一层的循环;此时就有了label的作用之处了;

// label语法:
outFor: for(let k = 0;k < 5;k++){
    for(let j = 0;j < 5;j++){
        if(k===3&&j===3)break outFor;
        console.log('k=',k,';j=',j)
    }
}
// 这段可以自己拿到控制台输出看看效果;

/**
    label: 循环体{
        ...多重循环体{
            
            break label;
        }
    }

简而言之:在循环体前面写一个特定的label(自定义),然后在break后面跟着要结束的循环label;
**/

有了label之后,无论多重循环嵌套多少,我们都可以在满足条件的时候结束任何一层循环(必须要指定循环的label);

总结:

for循环应该是每个程序猿都绕不过的一个点吧;现在前端的遍历,枚举方法越来越多了,但是for永远都是一把万能钥匙;合理的运用for会给到很多意想不到的效果;