Метка label в JavaScript

label - это метка, которой можно подписать инструкцию в JavaScript. Чаще всего метки используют вместе с break и continue, когда нужно управлять не ближайшим циклом, а внешним.

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

Что такое label

Без метки break останавливает только ближайший цикл.

for (let row = 1; row <= 3; row++) {
  for (let column = 1; column <= 3; column++) {
    if (column === 2) {
      break;
    }

    console.log(row + ':' + column);
  }
}

Результат:

1:1
2:1
3:1

break остановил внутренний цикл с column, но внешний цикл с row продолжил работу.

Если нужно остановить внешний цикл, можно поставить на него метку.

Синтаксис

labelName: statement

labelName - имя метки.

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

outerLoop: for (let row = 1; row <= 3; row++) {
  for (let column = 1; column <= 3; column++) {
    // тело цикла
  }
}

Здесь outerLoop - метка внешнего цикла.

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

break с меткой

break label завершает выполнение инструкции, отмеченной меткой.

outerLoop: for (let row = 1; row <= 3; row++) {
  for (let column = 1; column <= 3; column++) {
    if (row === 2 && column === 2) {
      break outerLoop;
    }

    console.log(row + ':' + column);
  }
}

Результат:

1:1
1:2
1:3
2:1

Когда row стал равен 2, а column - 2, сработал break outerLoop. Цикл с меткой outerLoop завершился полностью.

Без метки остановился бы только внутренний цикл.

continue с меткой

continue label завершает текущую итерацию цикла, отмеченного меткой, и запускает следующую.

outerLoop: for (let row = 1; row <= 3; row++) {
  for (let column = 1; column <= 3; column++) {
    if (column === 2) {
      continue outerLoop;
    }

    console.log(row + ':' + column);
  }
}

Результат:

1:1
2:1
3:1

Когда column становится равен 2, инструкция continue outerLoop переносит выполнение к следующей итерации внешнего цикла. Поэтому значения с column равным 2 и 3 не выводятся.

Важно: continue с меткой можно использовать только для цикла. Для обычной инструкции он не подойдет.

Когда использовать label

Метки могут пригодиться, когда есть вложенные циклы и нужно выйти из внешнего цикла или перейти к его следующей итерации.

Например, при поиске значения в таблице.

let table = [
  [2, 4, 6],
  [8, 10, 12],
  [14, 16, 18]
];

let searchedNumber = 10;

search: for (let row of table) {
  for (let number of row) {
    if (number === searchedNumber) {
      console.log('Число найдено');
      break search;
    }
  }
}

Как только число найдено, нет смысла продолжать оба цикла. Поэтому break search завершает внешний цикл.

При этом метки не стоит использовать без необходимости. Если код с меткой становится труднее читать, часто лучше вынести часть логики в функцию и использовать return.

Итого

1. label - это метка, которой можно подписать инструкцию.

2. Чаще всего метки используют с вложенными циклами.

3. break label завершает инструкцию, отмеченную меткой.

4. continue label переходит к следующей итерации отмеченного цикла.

5. Метки лучше применять редко, когда они действительно упрощают работу с вложенными циклами.