JS中带标签的语句配合break是唯一能直接跳出多层嵌套循环的方法;在循环前加“标签名:”,break后跟该标签名即可跳出,标签名不能为保留字且不可跨函数作用域引用。

JS 中带标签的语句(label)配合 break,是唯一能直接跳出多层嵌套循环的方法——它不依赖标志变量,也不用函数封装,简洁明确。
语法结构:标签 + break 后跟标签名
在任意语句(通常是 for、while 或 do...while)前加一个标识符加冒号,就构成了标签;break 后紧跟该标签名,即可跳出到该标签所在语句的末尾。
注意:标签名不能是保留字(如 if、for),且不能跨函数作用域引用。
示例:
outer: for (let i = 0; i < 3; i++) {
inner: for (let j = 0; j < 3; j++) {
if (i === 1 && j === 1) {
break outer; // 直接跳出外层循环
}
console.log(i, j);
}
}
// 输出:
// 0 0
// 0 1
// 0 2
// 1 0
只对循环和 switch 有效,普通代码块不行
标签只能用在可被中断的语句上,即:for、for...of、for...in、while、do...while 和 switch。下面写法是**无效的**:
-
{ label: console.log('hi'); break label; }—— 普通块语句不支持break -
if (true) { label: console.log('no'); break label; }——if不是可中断语句
若想控制非循环逻辑,应改用函数返回或提前 return。
break 和 continue 都支持标签,用途不同
break label 终止整个带标签的语句;continue label 则跳过当前迭代,从标签处重新开始下一轮(仅适用于循环)。
例如:
outer: for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
if (j === 1) continue outer; // 跳过当前 i 的剩余内层循环,进入 i+1
console.log(i, j);
}
}
// 输出:
// 0 0
// 1 0
// 2 0
实际使用建议
- 标签名尽量语义化,比如
searchLoop、matrixScan,避免loop1这类无意义命名 - 嵌套超过三层时,优先考虑重构(如提取为函数),而非过度依赖标签
- 不要在箭头函数或异步回调中定义标签后在外层
break—— 标签必须与break在同一作用域内 - ESLint 默认会警告未使用的标签(
no-unused-labels),确保每个标签都有对应break或continue


















