Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: Iterable, Iterator, for...of, Symbol.iterator, protocol

В чем отличие Iterable от Iterator?

Вопрос проверяет понимание различий между интерфейсами Iterable и Iterator в JavaScript, что необходимо для корректной работы с циклами for...of и создания пользовательских итерируемых объектов.

Короткий ответ

Iterable — это объект, который реализует метод Symbol.iterator, возвращающий Iterator. Iterator — это объект с методом next(), который возвращает объект { value, done }. Iterable можно использовать в for...of, а Iterator — это механизм для пошагового обхода. Например, массив — это Iterable, а вызов array[Symbol.iterator]() возвращает Iterator для этого массива.

Длинный ответ

В JavaScript протокол итерации позволяет объектам определять или настраивать своё поведение при итерации, например, в цикле for...of. Ключевыми компонентами этого протокола являются интерфейсы Iterable и Iterator.

Iterable (Итерируемый объект)

Объект является итерируемым, если он реализует метод с ключом Symbol.iterator. Этот метод должен возвращать объект, соответствующий интерфейсу Iterator. Стандартные встроенные типы, такие как Array, String, Map, Set, являются итерируемыми по умолчанию.

const arr = [1, 2, 3];
// Получаем итератор из итерируемого объекта
const iterator = arr[Symbol.iterator]();
console.log(iterator.next()); // { value: 1, done: false }

Iterator (Итератор)

Итератор — это объект, который реализует метод next(). При каждом вызове next() возвращается объект с двумя свойствами: value (текущее значение) и done (логический флаг, указывающий, завершена ли итерация). Итератор управляет состоянием итерации (например, текущей позицией).

function createSimpleIterator(max) {
  let count = 0;
  return {
    next() {
      if (count < max) {
        return { value: count++, done: false };
      }
      return { value: undefined, done: true };
    }
  };
}
const myIterator = createSimpleIterator(3);
console.log(myIterator.next()); // { value: 0, done: false }

Как они работают вместе

Когда цикл for...of запускается для итерируемого объекта, он сначала вызывает метод Symbol.iterator, чтобы получить итератор, а затем повторно вызывает next() на этом итераторе, пока done не станет true. Это разделение позволяет иметь несколько независимых итераторов для одного и того же итерируемого объекта.

Практическое применение

  • Создание пользовательских итерируемых структур данных (например, связных списков, деревьев).
  • Ленивая генерация последовательностей (бесконечные последовательности, чтение больших файлов по частям).
  • Использование с операторами распространения (...) и деструктуризацией, которые также работают с итерируемыми объектами.
// Пример пользовательского Iterable
const range = {
  from: 1,
  to: 3,
  [Symbol.iterator]() {
    let current = this.from;
    let last = this.to;
    return {
      next() {
        if (current <= last) {
          return { value: current++, done: false };
        }
        return { done: true };
      }
    };
  }
};
for (let num of range) {
  console.log(num); // 1, 2, 3
}

Вывод: Используйте Iterable, когда нужно определить объект, который можно перебирать (например, в for...of). Iterator — это низкоуровневый механизм для управления процессом итерации; он полезен, когда требуется тонкий контроль над обходом данных или реализация ленивых вычислений.

Уровень

  • Рейтинг:

    3

  • Сложность:

    4

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#Iterable

#Iterator

#for...of

#Symbol.iterator

#protocol

Подпишись на Java Developer в телеграм