Метка 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. Метки лучше применять редко, когда они действительно упрощают работу с вложенными циклами.