Цикл for

Цикл for

Технический фундамент цикла for

for - это цикл со встроенной моделью управления состоянием итерации: инициализация, проверка условия и шаг обновления. Технически он удобен там, где нужно явно контролировать индекс, границы и порядок обхода.

Ключевой момент: for дает полный контроль над счетчиком и критерием остановки.

Проверь себя: почему писать 100 однотипных строк вручную хуже, чем один цикл for?

Структура цикла for

for (инициализация; условие; шаг) {
  // тело цикла
}

Пример:

for (let i = 0; i < 3; i++) {
  console.log(i);
}
  • let i = 0 - старт счетчика;
  • i < 3 - условие продолжения;
  • i++ - изменение счетчика после каждой итерации.

Смотри, что важно: если условие всегда истинно, получишь бесконечный цикл.

Работа со счетчиком

Счетчик обычно используется для доступа к элементам массива по индексу.

const scores = [50, 72, 90];

for (let i = 0; i < scores.length; i++) {
  console.log(scores[i]);
}

Здесь часто путаются с границами: i <= scores.length приведет к лишней итерации и undefined.

Проверь себя: почему условие должно быть именно < length, а не <= length?

Итерация в обратном порядке (с конца массива)

Иногда нужно пройти массив от последнего элемента к первому: например, чтобы обработать свежие данные раньше старых или безопасно удалять элементы по условию.

const logs = ['old', 'mid', 'new'];

for (let i = logs.length - 1; i >= 0; i--) {
  console.log(i, logs[i]);
}

Ключевые правила:

  • стартуй с length - 1, потому что последний валидный индекс именно такой;
  • условие делай i >= 0, чтобы не пропустить нулевой индекс;
  • шаг в обратную сторону: i--.

Проверь себя: что сломается, если начать с i = logs.length?

Мини-сценарий: подсчет суммы

const prices = [100, 250, 80];
let total = 0;

for (let i = 0; i < prices.length; i++) {
  total += prices[i];
}

console.log(total); // 430

Это классическая прикладная задача: пройти по списку и накопить результат.

Прерывание и пропуск итераций

  • break - остановить цикл полностью;
  • continue - перейти к следующей итерации.
for (let i = 0; i < 10; i++) {
  if (i === 5) break;
  if (i % 2 === 0) continue;
  console.log(i);
}

Смотри, что важно: эти операторы полезны, но могут ухудшить читаемость, если их слишком много.

Дополнительный пример для новичка: поиск с конца массива

const nums = [5, -2, -1, 8, -3];
let lastPositive = null;

for (let i = nums.length - 1; i >= 0; i--) {
  if (nums[i] > 0) {
    lastPositive = nums[i];
    break;
  }
}

console.log(lastPositive); // 8

Здесь for в обратном порядке решает конкретную задачу: быстро найти последний подходящий элемент без полного прохода массива.

Частые ошибки новичков

  • Неверная граница цикла (<= вместо <).
  • Забытый шаг счетчика (i++) и бесконечный цикл.
  • Изменение счетчика в нескольких местах одновременно.
  • Для обратного прохода старт с length вместо length - 1.
  • Для обратного прохода условие i > 0, которое пропускает индекс 0.
  • Использование for там, где без индекса лучше for...of.

Анти-провал: перед запуском цикла ответь себе на три вопроса: с чего начинаю, до какого условия и как меняю счетчик.

Что будет, если изменить входные данные

Если массив пустой, цикл просто не выполнится - это нормальный edge case. Если в массиве есть undefined, сумма может стать NaN, значит иногда нужно дополнительно проверять элементы перед арифметикой.

Например, можно пропускать некорректные элементы:

let total = 0;
for (let i = 0; i < prices.length; i++) {
  const price = Number(prices[i]);
  if (!Number.isFinite(price)) continue;
  total += price;
}

Проверь себя: как защитить сумму от некорректных элементов в массиве?

Краткий итог

  • for удобен для повторений с явным счетчиком.
  • Он особенно полезен для прохода по массивам с индексом.
  • Для обратного обхода массива используй старт length - 1, условие >= 0 и шаг i--.
  • Границы и шаг цикла критичны для корректности.
  • break/continue дают контроль потока, но требуют аккуратности.
  • Четкий for-цикл делает обработку коллекций предсказуемой и удобной для отладки.