Learning Book

break, continue, метки

break, continue, метки

break — выход из цикла

break немедленно завершает выполнение цикла:

// Поиск первого элемента
const nums = [3, 7, 2, 8, 4];
let found = -1;

for (let i = 0; i < nums.length; i++) {
  if (nums[i] > 5) {
    found = nums[i];
    break; // Нашли — дальше не ищем
  }
}
console.log(found); // 7

// break в while — безопасный выход
let attempts = 0;
while (true) {
  const result = tryConnect();
  if (result.success) break;
  if (++attempts >= 3) break;
}

continue — пропуск итерации

continue пропускает текущую итерацию и переходит к следующей:

// Вывод только чётных чисел
for (let i = 0; i < 10; i++) {
  if (i % 2 !== 0) continue; // нечётные — пропускаем
  console.log(i); // 0, 2, 4, 6, 8
}

// Обработка валидных элементов
for (const item of items) {
  if (!item.isValid()) continue; // невалидные пропускаем
  processItem(item);
}
continue часто используется как "guard clause" внутри цикла — для пропуска граничных случаев без глубокой вложенности.

Метки (labels)

Метки позволяют управлять вложенными циклами — выходить из внешнего цикла изнутри внутреннего:

// Без меток — break выходит только из внутреннего цикла
outer: for (let i = 0; i < 3; i++) {
  inner: for (let j = 0; j < 3; j++) {
    if (i === 1 && j === 1) {
      break outer; // Выходим из ВНЕШНЕГО цикла
    }
    console.log(`${i},${j}`);
  }
}
// Выводит: 0,0  0,1  0,2  1,0  — и остановился

// continue с меткой — пропустить итерацию внешнего цикла
outer: for (let i = 0; i < 3; i++) {
  for (let j = 0; j < 3; j++) {
    if (j === 1) continue outer; // Переходим к следующей итерации ВНЕШНЕГО
    console.log(`${i},${j}`);
  }
}
// Выводит: 0,0  1,0  2,0
Метки — редко используемая функция. Если видите необходимость в метке, подумайте: может лучше вынести вложенный цикл в отдельную функцию?

Метки появились в JavaScript ещё до того, как стало ясно, что код с ними трудно читать. Современная альтернатива — вынести тело цикла в функцию:

// С меткой — сложнее читать
outer: for (const row of matrix) {
  for (const cell of row) {
    if (cell === target) break outer;
  }
}

// С функцией — чище
function findInMatrix(matrix, target) {
  for (const row of matrix) {
    for (const cell of row) {
      if (cell === target) return true; // return заменяет break outer
    }
  }
  return false;
}