有趣的for和break

提起for循环break想必大家都不陌生了,但你可能并不知道for循环还能命名,break还能终止指定名字的for循环。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
outLoop: for (let i = 0; i < 3; i++) {
innerLoop: for (let j = 0; j < 3; j++) {
console.log(i,j)
}
}
/*运行结果:
0 0
0 1
0 2
1 0
1 1
1 2
2 0
2 1
2 2
*/

从运行结果来看,这和我们平常写的for循环没什么两样,只不过在for前面加了个自定义的名字

当满足某个条件时,我们想要终止内层循环时,可以这样写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
outLoop: for (let i = 0; i < 3; i++) {
innerLoop: for (let j = 0; j < 3; j++) {
if(i == 1 && j == 1)
break
console.log(i,j)
}
}
/*运行结果:
0 0
0 1
0 2
1 0
2 0
2 1
2 2
*/

如果要终止外层循环呢?这时候我们自定义的名字就起作用了

1
2
3
4
5
6
7
8
9
10
11
12
13
outLoop: for (let i = 0; i < 3; i++) {
innerLoop: for (let j = 0; j < 3; j++) {
if(i == 1 && j == 1)
break outLoop
console.log(i,j)
}
}
/*运行结果:
0 0
0 1
0 2
1 0
*/

当然我们也可以用booleanbreak的组合来代替命名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let flag = false;
outLoop: for (let i = 0; i < 3 && !flag; i++) {
innerLoop: for (let j = 0; j < 3; j++) {
if (i == 1 && j == 1) {
flag = true;
break;
}
console.log(i, j);
}
}
/*运行结果:
0 0
0 1
0 2
1 0
*/

总结:当只写一个break时,默认是终止最靠近的for循环;当在break后追加一个名字时,就会终止指定名字的for循环。其实为for循环命名也叫添加标号label(标签),其他语言里面也有类似的设计,比如C可以用goto,Java的break(虽然Java保留了goto关键字,但不允许使用)