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

Какой механизм позволяет итерироваться по коллекциям?

1.7 Middle🔥 131 комментариев
#JavaScript Core

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

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

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

Механизмы итерации в JavaScript

В JavaScript существует несколько ключевых механизмов для итерации по коллекциям, которые можно разделить на традиционные подходы и современные протоколы.

1. Протоколы итерации

Фундаментальным механизмом является протокол итерации, состоящий из двух частей:

  • Итерируемый протокол - требует наличия метода [Symbol.iterator](), который возвращает объект-итератор
  • Протокол итератора - требует наличия метода next(), возвращающего объект {value, done}
// Пример реализации собственного итератора
const myIterable = {
  data: [1, 2, 3],
  [Symbol.iterator]() {
    let index = 0;
    return {
      next: () => {
        if (index < this.data.length) {
          return { value: this.data[index++], done: false };
        }
        return { value: undefined, done: true };
      }
    };
  }
};

2. Основные способы итерации

Циклы

// Классический for
for (let i = 0; i < array.length; i++) {
  console.log(array[i]);
}

// for...in (для перечисляемых свойств объектов)
for (const key in object) {
  console.log(key, object[key]);
}

// for...of (для итерируемых объектов)
for (const value of iterable) {
  console.log(value);
}

Методы массивов

Современный JavaScript предоставляет богатый набор методов для работы с коллекциями:

const numbers = [1, 2, 3, 4, 5];

// forEach - для простой итерации
numbers.forEach((item, index) => {
  console.log(`Index ${index}: ${item}`);
});

// map - для трансформации
const doubled = numbers.map(x => x * 2);

// filter - для фильтрации
const evens = numbers.filter(x => x % 2 === 0);

// reduce - для агрегации
const sum = numbers.reduce((acc, curr) => acc + curr, 0);

3. Итерируемые встроенные типы

В JavaScript по умолчанию итерируемыми являются:

  • Array и типизированные массивы (Int8Array, Uint32Array и др.)
  • String (итерируется по символам)
  • Map и Set
  • arguments и NodeList (в браузерах)
  • Генераторы
// Итерация по Map
const map = new Map([['a', 1], ['b', 2]]);
for (const [key, value] of map) {
  console.log(key, value);
}

// Итерация по Set
const set = new Set([1, 2, 3, 3]);
for (const value of set) {
  console.log(value); // 1, 2, 3 (дубликаты удалены)
}

4. Генераторы как итераторы

Генераторы - особый вид функций, которые упрощают создание итераторов:

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

const generator = numberGenerator();
console.log(generator.next()); // {value: 1, done: false}
console.log(generator.next()); // {value: 2, done: false}
console.log(generator.next()); // {value: 3, done: false}
console.log(generator.next()); // {value: undefined, done: true}

5. Современные операторы итерации

Оператор spread (...)

const arr = [1, 2, 3];
const copy = [...arr]; // Создание копии
const combined = [...arr, 4, 5]; // Объединение

Деструктуризация

const [first, second, ...rest] = [1, 2, 3, 4, 5];
console.log(first); // 1
console.log(rest); // [3, 4, 5]

6. Практические рекомендации

  1. Выбор подхода зависит от задачи:

    • for...of - для простой итерации
    • forEach - для side-эффектов без создания нового массива
    • map/filter/reduce - для трансформации данных
    • for - когда нужен контроль над индексом или производительность критична
  2. Производительность: В большинстве случаев современные методы (map, filter) достаточно быстры, но классический for может быть оптимальнее для больших данных.

  3. Ленивые вычисления: Генераторы позволяют реализовать ленивую итерацию, вычисляя значения по требованию.

Ключевое преимущество протокола итерации в JavaScript - его универсальность: один механизм (for...of) работает со всеми итерируемыми типами, а создание собственных итерируемых структур становится простым и предсказуемым. Это основа для работы с асинхронными итераторами (async/await с for await...of), что особенно важно в современных приложениях.

Какой механизм позволяет итерироваться по коллекциям? | PrepBro