Метка
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Метки используются вместе с операторами break
и continue
. Они выступают в роли идентификатора инструкции, на который можно сослаться.
Интерактивный пример
let str = "";
loop1: for (let i = 0; i < 5; i++) {
if (i === 1) {
continue loop1;
}
str = str + i;
}
console.log(str);
// Expected output: "0234"
Синтаксис
Описание
Вы можете использовать метки для обозначения циклов, чтобы затем при помощи break
или continue
выходить из цикла или продолжать его работу с новой итерации соответственно.
Обратите внимание, в JavaScript отсутствует оператор goto
, вы можете использовать метки только с break
или continue
.
В строгом режиме использование слова "let
" в качестве имени метки запрещено — вы получите ошибку SyntaxError
(потому что let
является ключевым словом в новых стандартах JavaScript).
Примеры
Использование метки с оператором continue в цикле
let i, j;
loop1: for (i = 0; i < 3; i++) {
//Первый цикл, обозначенный меткой "loop1"
loop2: for (j = 0; j < 3; j++) {
//Второй цикл, обозначенный меткой "loop2"
if (i === 1 && j === 1) {
continue loop1;
}
console.log("i = " + i + ", j = " + j);
}
}
// Вывод:
// "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"
Другой пример использования метки с continue
В примере по массиву элементов и массиву тест-функций вычисляется количество элементов, которые проходят все тесты.
let itemsPassed = 0;
let i, j;
top: for (i = 0; i < items.length; i++) {
for (j = 0; j < tests.length; j++) {
if (!tests[j].pass(items[i])) {
continue top;
}
}
itemsPassed++;
}
Использование метки с оператором break в цикле
let i, j;
loop1: for (i = 0; i < 3; i++) {
//Первый цикл, обозначенный меткой "loop1"
loop2: for (j = 0; j < 3; j++) {
//Второй цикл, обозначенный меткой "loop2"
if (i === 1 && j === 1) {
break loop1;
}
console.log("i = " + i + ", j = " + j);
}
}
// Вывод:
// "i = 0, j = 0"
// "i = 0, j = 1"
// "i = 0, j = 2"
// "i = 1, j = 0"
// Обратите внимание на разницу результатов в аналогичном примере с continue
Другой пример использования метки с break
В примере по массиву элементов и массиву тест-функций определяется, все ли элементы проходят все тесты.
let allPass = true;
let i, j;
top: for (i = 0; i < items.length; i++) {
for (j = 0; j < tests.length; j++) {
if (!tests[j].pass(items[i])) {
allPass = false;
break top;
}
}
}
Использование метки для блока инструкций с break
Метки можно использовать для обычных блоков кода, но только с оператором break
.
foo: {
console.log("привет");
break foo;
console.log("эта строка не будет исполнена");
}
console.log("мир");
// Вывод:
// "привет"
// "мир"
Объявление функций с меткой
Начиная с ECMAScript 2015, объявление функции с меткой допускается только в обычном режиме для совместимости с этой нестандартной, но реализованной в некоторых браузерах, возможностью.
L: function F() {}
Однако в строгом режиме такой код вызовет ошибку SyntaxError
:
"use strict";
L: function F() {}
// SyntaxError: functions cannot be labelled
Объявление функций-генераторов с меткой не допускается ни в обычном, ни в строгом режимах:
L: function* F() {}
// SyntaxError: generator functions cannot be labelled
Спецификации
Specification |
---|
ECMAScript® 2025 Language Specification # sec-labelled-statements |
Совместимость с браузерами
Report problems with this compatibility data on GitHubdesktop | mobile | server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
label |
Legend
Tip: you can click/tap on a cell for more information.
- Full support
- Full support