Мітка

Мітка (label) може використовуватися з операторами break та continue. Вона додається попереду виразу у вигляді ідентифікатора, на який можна посилатися.

Заувага: Використання помічених циклів або блоків є дуже нестандартним підходом. Зазвичай використовуються виклики функцій замість стрибків у циклах.

Синтаксис

label :
   statement
label
Будь-який ідентифікатор JavaScript, який не є зарезервованим словом.
statement
Інструкція JavaScript. Оператор break може використовуватися з будь-якою поміченою конструкцією, а оператор continue може використовуватися з поміченими циклами.

Опис

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

Зауважте, що у JavaScript немає оператора goto, ви можете використовувати мітки лише з break або continue.

У строгому режимі не можна використовувати "let" в якості імені мітки. Це спричинить викидання SyntaxError (let є зарезервованим ідентифікатором).

Приклади

Використання поміченого continue з циклами for

var i, j;

loop1:
for (i = 0; i < 3; i++) {      //Перший цикл for помічений як "loop1"
   loop2:
   for (j = 0; j < 3; j++) {   //Другий цикл for помічений як "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

Маючи масив елементів та масив тестів, цей приклад рахує кількість елементів, які пройшли усі тести.

var itemsPassed = 0;
var 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 з циклами for

var i, j;

loop1:
for (i = 0; i < 3; i++) {      //Перший цикл for помічений як "loop1"
   loop2:
   for (j = 0; j < 3; j++) {   //Другий цикл for помічений як "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

Маючи масив елементів та масив тестів, цей приклад визначає, чи усі елементи пройшли усі тести.

var allPass = true;
var i, j;

top:
for (i = 0; items.length; i++)
  for (j = 0; j < tests.length; i++)
    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

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

Специфікація
ECMAScript (ECMA-262)
The definition of 'Labelled statement' in that specification.

Сумісність з веб-переглядачами

BCD tables only load in the browser

Див. також