Метка

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"

Синтаксис

js
label:
  statement;
label

Идентификатор. Любое слово, кроме ключевых и зарезервированных в JavaScript.

statement

Инструкция. break может быть использован внутри любого блока инструкций с меткой, а с continue только внутри циклов.

Описание

Вы можете использовать метки для обозначения циклов, чтобы затем при помощи break или continue выходить из цикла или продолжать его работу с новой итерации соответственно.

Обратите внимание, в JavaScript отсутствует оператор goto, вы можете использовать метки только с break или continue.

В строгом режиме использование слова "let" в качестве имени метки запрещено — вы получите ошибку SyntaxError (потому что let является ключевым словом в новых стандартах JavaScript).

Примеры

Использование метки с оператором continue в цикле

js
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

В примере по массиву элементов и массиву тест-функций вычисляется количество элементов, которые проходят все тесты.

js
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 в цикле

js
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

В примере по массиву элементов и массиву тест-функций определяется, все ли элементы проходят все тесты.

js
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.

js
foo: {
  console.log("привет");
  break foo;
  console.log("эта строка не будет исполнена");
}
console.log("мир");

// Вывод:
//   "привет"
//   "мир"

Объявление функций с меткой

Начиная с ECMAScript 2015, объявление функции с меткой допускается только в обычном режиме для совместимости с этой нестандартной, но реализованной в некоторых браузерах, возможностью.

js
L: function F() {}

Однако в строгом режиме такой код вызовет ошибку SyntaxError:

js
"use strict";
L: function F() {}
// SyntaxError: functions cannot be labelled

Объявление функций-генераторов с меткой не допускается ни в обычном, ни в строгом режимах:

js
L: function* F() {}
// SyntaxError: generator functions cannot be labelled

Спецификации

Specification
ECMAScript® 2025 Language Specification
# sec-labelled-statements

Совместимость с браузерами

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
label

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

Смотрите также