Управление циклом
Иногда цикл не нужно проходить до конца: искомое уже найдено, или текущий элемент надо пропустить. Для этого есть две команды — break и continue. Они работают во всех циклах: for, while и for...of.
break
Команда break немедленно завершает цикл. Программа продолжает работу с кода, который идёт после цикла:
for (let i = 1; i <= 10; i++) {
if (i === 4) {
break;
}
console.log(i);
}
// 1
// 2
// 3Хотя условие цикла разрешало дойти до 10, на четвёрке он остановился.
continue
Команда continue пропускает остаток текущей итерации и сразу переходит к следующей. Цикл при этом не прекращается:
for (let i = 1; i <= 5; i++) {
if (i % 2 === 0) {
continue;
}
console.log(i);
}
// 1
// 3
// 5Чётные числа пропускаются: для них console.log не выполняется.
Поиск с break
Чаще всего break используют при поиске: как только нужное найдено, проверять остальное незачем. Результат поиска сохраняют в переменную, объявленную до цикла:
let found = 0;
for (let n = 50; n <= 100; n++) {
if (n % 7 === 0) {
found = n;
break;
}
}
console.log(found); // 56Цикл нашёл первое число от 50, которое делится на 7, и сразу остановился.
Вложенные циклы
Цикл можно поместить внутрь другого цикла — такие циклы называют вложенными. На каждую итерацию внешнего цикла внутренний проходит полностью:
for (let row = 1; row <= 2; row++) {
for (let col = 1; col <= 3; col++) {
console.log(`${row}-${col}`);
}
}
// 1-1
// 1-2
// 1-3
// 2-1
// 2-2
// 2-3Так перебирают таблицы, клетки игрового поля и все пары значений.
break во вложенных циклах
break завершает только тот цикл, внутри которого он написан. Внешний цикл после этого продолжает работу:
for (let row = 1; row <= 2; row++) {
for (let col = 1; col <= 3; col++) {
if (col === 2) {
break;
}
console.log(`${row}-${col}`);
}
}
// 1-1
// 2-1Если нужно выйти сразу из всех циклов, удобнее вынести их в функцию и завершить её через return — об этом в главе о функциях.
Частая ошибка
В цикле while команда continue перескакивает и через изменение счётчика, если оно стоит ниже. Тогда счётчик перестаёт меняться, и цикл становится бесконечным:
let i = 0;
while (i < 5) {
if (i === 2) {
continue; // i++ ниже не выполнится — цикл зависнет
}
i++;
}Меняйте счётчик до continue или используйте цикл for, где шаг выполняется всегда.