← Назад к вопросам

Что такое Iterable?

2.2 Middle🔥 152 комментариев
#Другое

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Iterable в JavaScript?

Iterable (Итерируемый объект) — это фундаментальная концепция в JavaScript, представляющая собой объект, который реализует протокол итерации. Это означает, что объект определяет способ последовательного доступа к своим элементам через стандартизированный интерфейс, что позволяет удобно перебирать его содержимое в циклах и использовать с современными синтаксическими конструкциями языка.

Основы протокола итерации

Протокол итерации состоит из двух ключевых требований:

  • Объект должен иметь метод с ключом Symbol.iterator.
  • Этот метод должен возвращать итератор — объект с методом next(), который возвращает объект вида { value: any, done: boolean }.

Пример базовой реализации:

// Создаем простой итерируемый объект
const myIterable = {
  data: [10, 20, 30],
  
  [Symbol.iterator]() {
    let index = 0;
    const data = this.data;
    
    // Возвращаем итератор
    return {
      next() {
        if (index < data.length) {
          return { value: data[index++], done: false };
        }
        return { value: undefined, done: true };
      }
    };
  }
};

// Использование в цикле for...of
for (const item of myIterable) {
  console.log(item); // 10, 20, 30
}

Встроенные итерируемые объекты

JavaScript предоставляет множество встроенных итерируемых типов:

// Массивы
const array = [1, 2, 3];
for (const item of array) console.log(item);

// Строки (итерируются по символам)
const str = "Hello";
for (const char of str) console.log(char);

// Map и Set
const map = new Map([['a', 1], ['b', 2]]);
for (const [key, value] of map) console.log(key, value);

// NodeList в DOM
const nodeList = document.querySelectorAll('div');
for (const node of nodeList) console.log(node);

// Аргументы функции
function test(...args) {
  for (const arg of args) console.log(arg);
}

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

Распространение (spread) и деструктуризация:

// Spread operator работает с итерируемыми объектами
const set = new Set([1, 2, 3]);
const arrayFromSet = [...set]; // [1, 2, 3]

// Деструктуризация
const [first, second] = 'AB'; // first = 'A', second = 'B'

Генераторы как упрощенный способ создания итераторов:

function* numberGenerator() {
  yield 1;
  yield 2;
  yield 3;
}

const generator = numberGenerator();
for (const num of generator) {
  console.log(num); // 1, 2, 3
}

Ключевые преимущества итераторов

  • Универсальный интерфейс: Единый подход к перебору различных структур данных
  • Ленивые вычисления: Итераторы могут генерировать значения по требованию, что эффективно для работы с большими или бесконечными последовательностями
  • Совместимость с современным синтаксисом: Работа с for...of, spread operator, деструктуризацией
  • Кастомное поведение: Возможность создания специализированных итераторов для сложных структур данных

Отличие от Array-like объектов

Важно различать итерируемые и псевдомассивы (array-like). Псевдомассивы имеют свойство length и индексы, но могут не поддерживать итерацию:

// Array-like объект
const arrayLike = {
  0: 'a',
  1: 'b',
  length: 2
};

// Не является итерируемым!
// for (const item of arrayLike) {} // Ошибка!

// Но может быть преобразован
const realArray = Array.from(arrayLike); // ['a', 'b']

Современные практики использования

В современном Frontend-разработке итераторы используются повсеместно:

  • Обработка коллекций данных из API
  • Реализация пагинации с ленивой загрузкой
  • Создание кастомных структур данных (деревья, графы)
  • Асинхронные итераторы для работы с потоками данных

Понимание протокола итерации — обязательный навык для профессионального JavaScript-разработчика, поскольку эта концепция лежит в основе многих современных API и языковых возможностей ES6+.

Что такое Iterable? | PrepBro