Skip to main content
Практика завдань

Що таке symbol.iterator і навіщо він потрібен

Symbol.iterator — це спеціальний символ, який використовується в JavaScript для створення ітерованих об'єктів, тобто тих, які можна ітерувати за допомогою for...of, оператора розгортання (...), або використовувати в інших випадках, де потрібен ітерований інтерфейс.

Ітеровані об'єкти

Об'єкти, які мають метод з ключем Symbol.iterator, вважаються ітерованими. Це:

  • масиви []
  • рядки "hello"
  • множини Set
  • мапи Map
  • arguments
  • та інші вбудовані колекції

Приклад:

javascript
const arr = [1, 2, 3]; for (const value of arr) { console.log(value); // 1, 2, 3 }

Тут arr[Symbol.iterator] автоматично викликається в for...of.

Як працює Symbol.iterator

Метод Symbol.iterator повинен повертати об'єкт-ітератор, який має метод next(). Цей метод повертає об'єкт з двома властивостями:

  • value — поточне значення
  • done — булеве значення, яке вказує, чи завершено ітерування

Приклад кастомного ітератора

javascript
const customIterable = { data: [10, 20, 30], [Symbol.iterator]() { let index = 0; return { next: () => { if (index < this.data.length) { return { value: this.data[index++], done: false }; } else { return { done: true }; } } }; } }; for (const num of customIterable) { console.log(num); // 10, 20, 30 }

Чому ви не можете ітерувати звичайні об'єкти?

javascript
const obj = { a: 1, b: 2 }; for (const key of obj) { // TypeError: obj is not iterable }

Об'єкти за замовчуванням не є ітерованими, оскільки не мають методу [Symbol.iterator]. Щоб зробити об'єкт ітерованим, потрібно явно визначити цей метод.

Де використовується Symbol.iterator

  • for...of
  • spread (...)
  • Array.from()
  • Promise.all
  • Set
  • Map
  • деструктуризація: [...something]

Висновок

  • Symbol.iterator є ключем до ітерованості.
  • Будь-який об'єкт, що реалізує [Symbol.iterator], може бути використаний у for...of.
  • Ви можете створювати свої власні структури даних, що підтримують ітерацію відповідно до вашого сценарію.

Факт:

Symbol.iterator — це те, що робить можливими конструкції, такі як for...of, ...spread, і навіть yield* у генераторах.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.

Дочитали статтю?
Практика завдань