Spec-Zone.ru › JavaScript

Помеченный оператор

Базовая поддержка Широко доступно

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 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

Синтаксис помеченного объявления функции является устаревшим, и его не следует использовать, даже в нестрогом коде. Фактически вы не можете перейти к этой метке внутри тела функции.

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

Спецификация
Спецификация языка ECMAScript® 2027
# sec-labelled-statements

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

Десктоп Мобильные Сервер
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

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

  • break
  • continue

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API