问题背景
有下面这样一段代码:
for (let i = 0; i < 10; i++) {
for (let j = 0; j < 10; j++) {
// do something
}
}
假如想要在执行过程中,直接从最内层跳出所有的 for
循环,你们会怎样做?
我猜大多数人都是使用下面的方法:
额外定义变量
let flag = false;
for (let i = 0; i < 10; i++) {
if(flag) break;
for (let j = 0; j < 10; j++) {
// 当符合某个条件时
flag = true;
break;
}
}
或者也可以另辟蹊跷:
摧毁外部循环条件
for (let i = 0; i < 10; i++) {
for (let j = 0; j < 10; j++) {
// 当符合某个条件时
i = 10;
break;
}
}
说实话这个方法是真的巧妙,哪怕是有更多层级,只要摧毁对于层级的循环条件就行。但其实 JavaScript
内部有提供专门的在多层级嵌套循环中跳出指定层级的方法。
Js Label
在 JavaScript
中,label
(标签)是一种 JavaScript
语言中的较为特殊的语法结构,可以用于从一个普通的代码块内跳转到另外一个代码块内。使用 label
可以实现 JavaScript
中的多级循环或嵌套循环中跳出指定层循环等操作。
语法
标签的语法遵循 labelName: statement
的形式,其中 labelName
是标识符,表示定义的标签名称,statement
是任意一条有效的 JavaScript
语句。如之前示例用 Js Label
实现的方法如下:
outerloop: for (let i = 0; i < 10; i++) {
innerloop: for (let j = 0; j < 10; j++) {
// 当符合某个条件时
break outerloop;
}
}
这样就达成了了跳出最外层循环的目的,而且无论多少层,都可以使用这种方式实现,而且不只是 break
, continue
也可以:
loop1: for (let i = 0; i < 10; i++) {
loop2: for (let j = 0; j < 10; j++) {
loop3: for (let k = 0; k < 10; k++) {
// 当符合某个条件时
continue loop1;
}
}
}
上面代码就会在“符合某个条件时”,直接结束第三层和第二层的循环,继续执行第一层的循环
注意事项
-
标签必须与循环语句或
switch
语句相结合使用。在其他类型的语句上使用标签会导致语法错误。 -
标签名称必须是有效的标识符,并且不能与其他变量或关键字冲突,否则会抛出语法错误。
-
标签内只能包含一条语句,多条语句需要使用代码块进行包裹。
-
不提倡过度使用标签,因为这可能会导致代码可读性变差,增加出错的可能性,也不利于代码维护和重构。