Перейти к содержимому
Теория · Условия и циклы · урок 5 из 13

break и continue

Вернёмся к бегуну на стадионе. Тренер велел пробежать сто кругов, но иногда бег нужно прервать раньше. Бегун ищет на дорожке потерянный ключ: как только нашёл, он сходит с дорожки, и остальные круги уже не нужны. А на скользком участке он может срезать остаток круга и сразу начать следующий.

В цикле для этих двух случаев есть две инструкции:

  • break завершает весь цикл: бегун сходит с дорожки;
  • continue завершает только текущий проход: бегун бросает круг и начинает следующий.

Цикл for проходит все значения, заданные заголовком, но ответ иногда находится раньше. Чтобы найти первое число от 50 до 100, которое делится на 7, остальные числа проверять не нужно. После находки цикл прерывают инструкцией break:

JavaScript
for (let i = 50; i <= 100; i++) {
    if (i % 7 === 0) {
        console.log(i); // 56
        break;
    }
}

console.log("done"); // done

Давайте разберём, что происходит:

  1. Для 50–55 условие i % 7 === 0 ложно, и цикл идёт дальше.
  2. 56 делится на 7 без остатка, поэтому программа выводит 56.
  3. break завершает цикл, и программа выводит done.

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

break завершает весь цикл, а не только фигурные скобки if, внутри которых стоит. Оставшиеся итерации не выполняются, шаг i++ тоже, и программа переходит к коду после цикла. Поэтому сразу после 56 выводится done.

Без break цикл проверил бы все числа до 100 и вывел бы ещё 63, 70, 77, 84, 91 и 98.

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

continue завершает только текущую итерацию: остаток тела пропускается, и цикл переходит к следующему значению. В for перед этим выполняется шаг i++. Здесь чётные числа пропускаются, а нечётные дописываются в строку:

JavaScript
let odd = "";

for (let i = 1; i <= 6; i++) {
    if (i % 2 === 0) {
        continue;
    }
    odd += i;
}

console.log(odd); // 135

odd += i дописывает число в конец строки: "" + 1 — это "1", а "1" + 3 — это "13". Цикл после continue не прерывается, поэтому до строки odd += i доходят и 3, и 5.

То же можно записать без continue, условием i % 2 !== 0 вокруг odd += i. continue удобен, когда тело длинное: проверка стоит в начале, и остальной код не нужно прятать во вложенный if.

На собеседовании часто просят объяснить разницу этих двух инструкций. Короткий ответ: break завершает весь цикл, а continue — только текущую итерацию.

Вложенные циклы и метки

Здесь картинка со стадионом заканчивается: у бегуна одна дорожка, а циклы бывают вложенными. Если один цикл стоит внутри другого, break и continue действуют только на внутренний. Чтобы выйти из внешнего, перед ним ставят метку — имя с двоеточием, например outer: for (…). Затем пишут break outer:

JavaScript
outer: for (let i = 1; i <= 3; i++) {
    for (let j = 1; j <= 3; j++) {
        if (i * j === 4) {
            break outer;
        }
        console.log(i, j);
    }
}
// 1 1
// 1 2
// 1 3
// 2 1

При i, равной 2, и j, равной 2, произведение равно 4. break outer завершает сразу оба цикла, и пара 2 2 не выводится. Обычный break завершил бы только внутренний цикл, и внешний перешёл бы к i, равной 3.

Метки встречаются редко. Чаще вложенные циклы выносят в функцию и выходят из неё через return.

Частая ошибка

В цикле while инструкция continue стоит раньше, чем изменение переменной:

JavaScript
let i = 0;

while (i < 5) {
    if (i === 2) {
        continue; // ✗
    }
    console.log(i);
    i++;
}

Программа выводит 0 и 1, а затем зависает. Если вы запустили её у себя, остановите программу клавишами Ctrl+C в терминале.

При i, равной 2, continue пропускает остаток тела вместе с i++, поэтому i остаётся равной 2 на каждой следующей итерации. Бегун срезает круг, но забывает сделать отметку, и счёт не растёт. В while шага в заголовке нет, поэтому меняйте переменную до continue или перепишите цикл через for.

Главное

  • break завершает весь цикл, и программа переходит к коду после него.
  • continue пропускает остаток текущей итерации; в for перед следующей выполняется шаг.
  • Во вложенных циклах break действует на внутренний цикл, а break с меткой — на помеченный.
  • В while переменную меняют до continue, иначе цикл зависнет.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом