Logo
Книга для начинающих
ВходРегистрация
/
Программирование
/
Курс JavaScript
/

Цикл For

JavaScript: Цикл For

Цикл while идеален для ситуаций, когда количество итераций неизвестно заранее, например, при поиске простого числа. Когда количество итераций известно, предпочтительнее использовать цикл for.

Посмотрим реализацию переворота строки через цикл for:

const reverseString = (str) => {
  let result = '';
  for (let i = 0; i < str.length; i += 1) {
    result = `${str[i]}${result}`;
  }

  return result;
};

Можно читать так: цикл с индексом i повторяется пока i < str.length и после каждого шага увеличивает i на 1.

Разберём работу цикла по шагам для вызова reverseString('go!'):

до цикла: result = ''

i=0: result = `${str[0]}${result}` = 'g' + ''   = 'g'
i=1: result = `${str[1]}${result}` = 'o' + 'g'  = 'og'
i=2: result = `${str[2]}${result}` = '!' + 'og' = '!og'

Каждый новый символ приписывается слева от накопленного результата, поэтому строка собирается в обратном порядке.

В определении цикла for в круглых скобках есть три выражения, разделённые точкой с запятой:

  1. Начальное значение счётчика. Этот код выполняется ровно один раз перед первой итерацией.
  2. Предикат — условие повторения циклов. Выполняется на каждой итерации. Точно так же как и в while
  3. Описание изменения счётчика. Этот код выполняется в конце каждой итерации.

В остальном принцип работы точно такой же, как у цикла while.

Ещё пример: подсчёт символов

Посчитаем, сколько раз символ встречается в строке без учёта регистра:

const charsCount = (text, char) => {
  let result = 0;
  for (let i = 0; i < text.length; i += 1) {
    // приводим к нижнему регистру, чтобы не зависеть от регистра
    if (text[i].toLowerCase() === char.toLowerCase()) {
      result += 1;
    }
  }
  return result;
};

charsCount('hexlet!', 'e'); // 2
charsCount('hExlet!', 'E'); // 2
charsCount('hexlet!', 'a'); // 0

Здесь for управляет перебором символов, а условие внутри решает, увеличивать ли счётчик.

В определении for не обязательно указывать все три выражения. Если не указать условие повторения цикла, то цикл будет выполняться бесконечно:

let i = 1;
// Можно даже не указывать все три выражения
for (;;) {
  console.log(i);
  i += 1;
}

Задание

FizzBuzz — одно из самых известных заданий на собеседованиях для начинающих программистов. Его дают, чтобы проверить умение работать с циклами и условиями. Реализуйте функцию fizzBuzz(n), которая возвращает строку с числами от 1 до n.

При этом:

  • если число делится на 3, вместо него подставляется слово "Fizz";
  • если число делится на 5 — слово "Buzz";
  • если делится и на 3, и на 5 — слово "FizzBuzz".

Все элементы соединяются пробелом.

Пример вызова функции:

fizzBuzz(15);
// => '1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz'

Алгоритм

  1. Объявить нейтральный элемент агрегации (пустую строку).
  2. Пройти циклом for числа от 1 до n.
  3. Проверить число на условия деления.
  4. Добавить результат каждой итерации в итоговую строку через пробел.
Коммерческий опыт и Трудоустройство

Полезное

  • for шаблонные строки Логическое ИЛИ (||)

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

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

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются
/
Программирование
/
Курс JavaScript
/

Цикл For

JavaScript: Цикл For

Цикл while идеален для ситуаций, когда количество итераций неизвестно заранее, например, при поиске простого числа. Когда количество итераций известно, предпочтительнее использовать цикл for.

Посмотрим реализацию переворота строки через цикл for:

const reverseString = (str) => {
  let result = '';
  for (let i = 0; i < str.length; i += 1) {
    result = `${str[i]}${result}`;
  }

  return result;
};

Можно читать так: цикл с индексом i повторяется пока i < str.length и после каждого шага увеличивает i на 1.

Разберём работу цикла по шагам для вызова reverseString('go!'):

до цикла: result = ''

i=0: result = `${str[0]}${result}` = 'g' + ''   = 'g'
i=1: result = `${str[1]}${result}` = 'o' + 'g'  = 'og'
i=2: result = `${str[2]}${result}` = '!' + 'og' = '!og'

Каждый новый символ приписывается слева от накопленного результата, поэтому строка собирается в обратном порядке.

В определении цикла for в круглых скобках есть три выражения, разделённые точкой с запятой:

  1. Начальное значение счётчика. Этот код выполняется ровно один раз перед первой итерацией.
  2. Предикат — условие повторения циклов. Выполняется на каждой итерации. Точно так же как и в while
  3. Описание изменения счётчика. Этот код выполняется в конце каждой итерации.

В остальном принцип работы точно такой же, как у цикла while.

Ещё пример: подсчёт символов

Посчитаем, сколько раз символ встречается в строке без учёта регистра:

const charsCount = (text, char) => {
  let result = 0;
  for (let i = 0; i < text.length; i += 1) {
    // приводим к нижнему регистру, чтобы не зависеть от регистра
    if (text[i].toLowerCase() === char.toLowerCase()) {
      result += 1;
    }
  }
  return result;
};

charsCount('hexlet!', 'e'); // 2
charsCount('hExlet!', 'E'); // 2
charsCount('hexlet!', 'a'); // 0

Здесь for управляет перебором символов, а условие внутри решает, увеличивать ли счётчик.

В определении for не обязательно указывать все три выражения. Если не указать условие повторения цикла, то цикл будет выполняться бесконечно:

let i = 1;
// Можно даже не указывать все три выражения
for (;;) {
  console.log(i);
  i += 1;
}

Задание

FizzBuzz — одно из самых известных заданий на собеседованиях для начинающих программистов. Его дают, чтобы проверить умение работать с циклами и условиями. Реализуйте функцию fizzBuzz(n), которая возвращает строку с числами от 1 до n.

При этом:

  • если число делится на 3, вместо него подставляется слово "Fizz";
  • если число делится на 5 — слово "Buzz";
  • если делится и на 3, и на 5 — слово "FizzBuzz".

Все элементы соединяются пробелом.

Пример вызова функции:

fizzBuzz(15);
// => '1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz'

Алгоритм

  1. Объявить нейтральный элемент агрегации (пустую строку).
  2. Пройти циклом for числа от 1 до n.
  3. Проверить число на условия деления.
  4. Добавить результат каждой итерации в итоговую строку через пробел.
Коммерческий опыт и Трудоустройство

Полезное

  • for шаблонные строки Логическое ИЛИ (||)

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

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

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются
← ПредыдущийСледующий →
← ПредыдущийСледующий →
← ПредыдущийСледующий →

Ваше упражнение проверяется по этим тестам

import { expect, test } from 'vitest';
import f from './index.js';

test('test', () => {
  expect(f(3)).toEqual('1 2 Fizz');
  expect(f(5)).toEqual('1 2 Fizz 4 Buzz');
  expect(f(15)).toEqual(
    '1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz',
  );
});
← ПредыдущийСледующий →

Решение учителя откроется через:

20:00

waiting_clock
← ПредыдущийСледующий →