Мітка (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 3rd Edition (ECMA-262) Standard Початкове визначення. Реалізоване у JavaScript 1.2
ECMAScript 5.1 (ECMA-262)
The definition of 'Labelled statement' in that specification.
Standard
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Labelled statement' in that specification.
Standard
ECMAScript Latest Draft (ECMA-262)
The definition of 'Labelled statement' in that specification.
Draft

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

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
labelChrome Full support YesEdge Full support YesFirefox Full support 1IE Full support YesOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes

Legend

Full support  
Full support

Див. також

Мітки документа й учасники

Мітки: 
Зробили внесок у цю сторінку: DariaManko
Востаннє оновлена: DariaManko,