Помеченный оператор
Базовая поддержка Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
Помеченный оператор — это любой оператор, которому предшествует идентификатор. Вы можете перейти к этой метке, используя оператор break или continue, вложенный в помеченный оператор.
Попробуйте
let i, j;
loop1: for (i = 0; i < 3; i++) {
loop2: for (j = 0; j < 3; j++) {
if (i === 1 && j === 1) {
break loop1;
}
console.log(`i = ${i}, j = ${j}`);
}
}
// Expected output:
// "i = 0, j = 0"
// "i = 0, j = 1"
// "i = 0, j = 2"
// "i = 1, j = 0"
Синтаксис
label: statement
-
label - Любой идентификатор JavaScript, который не является зарезервированным словом.
-
statement - Оператор JavaScript.
breakможет использоваться в любом помеченном операторе, аcontinueможет использоваться в помеченных операторах цикла.
Описание
Вы можете использовать метку для идентификации оператора, а затем ссылаться на него с помощью оператора break или continue. Обратите внимание, что в JavaScript нет оператора goto; вы можете использовать метки только с break или continue.
Любой break или continue, ссылающийся на label, должен содержаться внутри statement, помеченного label. Думайте о label как о переменной, которая доступна только в области видимости statement.
Если оператор break label; встречается при выполнении statement, выполнение statement прекращается, и выполнение продолжается с оператора, непосредственно следующего за помеченным оператором.
continue label; можно использовать только в том случае, если statement является одним из операторов цикла. Если оператор continue label; встречается при выполнении statement, выполнение statement продолжается со следующей итерации цикла. continue; без метки может продолжить только самый внутренний цикл, в то время как continue label; позволяет продолжить любой заданный цикл, даже если оператор вложен в другие циклы.
Оператор может иметь несколько меток. В этом случае все метки функционально эквивалентны.
Примеры
Использование помеченного continue с циклами for
// The first for statement is labeled "loop1"
loop1: for (let i = 0; i < 3; i++) {
// The second for statement is labeled "loop2"
loop2: for (let j = 0; j < 3; j++) {
if (i === 1 && j === 1) {
continue loop1;
}
console.log(`i = ${i}, j = ${j}`);
}
}
// Logs:
// i = 0, j = 0
// i = 0, j = 1
// i = 0, j = 2
// i = 1, j = 0
// i = 2, j = 0
// i = 2, j = 1
// i = 2, j = 2
Обратите внимание, как он пропускает как "i = 1, j = 1", так и "i = 1, j = 2".
Использование помеченного break с циклами for
let i, j;
// The first for statement is labeled "loop1"
loop1: for (i = 0; i < 3; i++) {
// The second for statement is labeled "loop2"
loop2: for (j = 0; j < 3; j++) {
if (i === 1 && j === 1) {
break loop1;
}
console.log(`i = ${i}, j = ${j}`);
}
}
// Logs:
// i = 0, j = 0
// i = 0, j = 1
// i = 0, j = 2
// i = 1, j = 0
Обратите внимание на разницу с предыдущим примером continue: когда встречается break loop1, выполнение внешнего цикла прекращается, поэтому дальнейших логов, кроме "i = 1, j = 0", нет; когда встречается continue loop1, выполнение внешнего цикла продолжается на следующей итерации, поэтому пропускаются только "i = 1, j = 1" и "i = 1, j = 2".
Использование помеченного оператора continue
Учитывая массив элементов и массив тестов, этот пример подсчитывает количество элементов, прошедших все тесты.
// Numbers from 1 to 100
const items = Array.from({ length: 100 }, (_, i) => i + 1);
const tests = [
{ pass: (item) => item % 2 === 0 },
{ pass: (item) => item % 3 === 0 },
{ pass: (item) => item % 5 === 0 },
];
let itemsPassed = 0;
itemIteration: for (const item of items) {
for (const test of tests) {
if (!test.pass(item)) {
continue itemIteration;
}
}
itemsPassed++;
}
Обратите внимание, как оператор continue itemIteration; пропускает остальные тесты для текущего элемента, а также оператор, который обновляет счетчик itemsPassed, и переходит к следующему элементу. Если вы не используете метку, вам придется использовать логический флаг.
// Numbers from 1 to 100
const items = Array.from({ length: 100 }, (_, i) => i + 1);
const tests = [
{ pass: (item) => item % 2 === 0 },
{ pass: (item) => item % 3 === 0 },
{ pass: (item) => item % 5 === 0 },
];
let itemsPassed = 0;
for (const item of items) {
let passed = true;
for (const test of tests) {
if (!test.pass(item)) {
passed = false;
break;
}
}
if (passed) {
itemsPassed++;
}
}
Использование помеченного оператора break
Учитывая массив элементов и массив тестов, этот пример определяет, прошли ли все элементы все тесты.
// Numbers from 1 to 100
const items = Array.from({ length: 100 }, (_, i) => i + 1);
const tests = [
{ pass: (item) => item % 2 === 0 },
{ pass: (item) => item % 3 === 0 },
{ pass: (item) => item % 5 === 0 },
];
let allPass = true;
itemIteration: for (const item of items) {
for (const test of tests) {
if (!test.pass(item)) {
allPass = false;
break itemIteration;
}
}
}
Опять же, если вы не используете метку, вам придется использовать логический флаг.
// Numbers from 1 to 100
const items = Array.from({ length: 100 }, (_, i) => i + 1);
const tests = [
{ pass: (item) => item % 2 === 0 },
{ pass: (item) => item % 3 === 0 },
{ pass: (item) => item % 5 === 0 },
];
let allPass = true;
for (const item of items) {
let passed = true;
for (const test of tests) {
if (!test.pass(item)) {
passed = false;
break;
}
}
if (!passed) {
allPass = false;
break;
}
}
Использование помеченного блока с break
Вы можете помечать операторы, отличные от циклов, например, простые блоки, но только операторы break могут ссылаться на метки, не относящиеся к циклам.
foo: {
console.log("face");
break foo;
console.log("this will not be executed");
}
console.log("swap");
// Logs:
// "face"
// "swap"
Помеченные объявления функций
Метки могут применяться только к операторам, а не к объявлениям. Существует устаревшая грамматика, которая позволяет помечать объявления функций в нестрогом коде:
L: function F() {}
Однако в коде строгого режима это приведет к ошибке SyntaxError:
"use strict";
L: function F() {}
// SyntaxError: functions cannot be labelled
Непростые функции, такие как функции-генераторы и асинхронные функции, не могут быть помечены ни в строгом, ни в нестрогом коде:
L: function* F() {}
// SyntaxError: generator functions cannot be labelled
Синтаксис помеченного объявления функции является устаревшим, и его не следует использовать, даже в нестрогом коде. Фактически вы не можете перейти к этой метке внутри тела функции.
Спецификации
Совместимость с браузерами
| Десктоп | Мобильные | Сервер | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
label |
1 |
12 |
1 |
4 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
Смотрите также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label