Learn JavaScript

Циклы while и do...while в JavaScript

Циклы while и do...while удобны, когда количество повторений заранее неизвестно. В отличие от for, где часто задаются границы и счетчик, while больше подходит для “повторять, пока условие истинно”.

while: условие проверяется до итерации

Синтаксис:

while (condition) {
  // тело цикла
}
  • условие проверяется перед каждой итерацией
  • если условие сразу false, цикл не выполнится ни разу

Пример с счетчиком:

let i = 0;

while (i < 3) {
  console.log(i);
  i += 1;
}
// 0
// 1
// 2

do…while: минимум одна итерация

Синтаксис:

do {
  // тело цикла
} while (condition);

Главное отличие: тело выполняется хотя бы один раз, потому что проверка условия идет после итерации.

let i = 0;

do {
  console.log(i);
  i += 1;
} while (i < 3);
// 0
// 1
// 2

Пример, где разница заметна:

let x = 10;

while (x < 5) {
  console.log("while");
}

do {
  console.log("do...while");
} while (x < 5);

// выведется только "do...while"

Когда использовать while и do…while

while удобно, когда:

  • проверка условия должна происходить до выполнения логики;
  • неизвестно количество повторений;
  • повторение зависит от внешнего события или результата вычисления.

do…while удобно, когда:

  • тело должно выполниться хотя бы один раз;
  • проверка возможна только после выполнения шага (например, после чтения ввода или вычисления результата).

break и continue

И в while, и в do...while работают break и continue.

break

break завершает цикл полностью.

let i = 0;

while (true) {
  if (i === 3) break;
  console.log(i);
  i += 1;
}
// 0 1 2

continue

continue пропускает оставшуюся часть текущей итерации и переходит к следующей.

let i = 0;

while (i < 5) {
  i += 1;

  if (i === 3) continue;
  console.log(i);
}
// 1 2 4 5

В while важно следить за тем, где меняется счетчик. Если continue срабатывает до изменения переменной, цикл может стать бесконечным.

Типичный сценарий: поиск до первого совпадения

while хорошо подходит, когда нужно идти по данным до выполнения условия.

const items = [3, 7, 10, 2, 9];

let i = 0;
let foundIndex = -1;

while (i < items.length) {
  if (items[i] === 2) {
    foundIndex = i;
    break;
  }
  i += 1;
}

console.log(foundIndex); // 3

Бесконечные циклы: как появляются и как избегать

Бесконечный цикл - когда условие никогда не становится false.

Самая частая причина - забыли изменить переменную, влияющую на условие.

let i = 0;

// while (i < 3) {
//   console.log(i);
// } // бесконечный цикл: i не меняется

Еще одна частая причина - continue “перепрыгивает” изменение счетчика.

Надежная привычка:

  • сначала изменить счетчик/состояние
  • затем использовать continue или выходить через break

Truthy/Falsy и while

Условие while приводится к boolean. Иногда это удобно, но важно понимать, какие значения считаются falsy.

Пример с уменьшением счетчика:

let attempts = 3;

while (attempts) {
  console.log("try", attempts);
  attempts -= 1;
}

Здесь цикл завершится, когда attempts станет 00 - falsy).

Что стоит запомнить

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