Що таке symbol.iterator і навіщо він потрібен
Symbol.iterator — це спеціальний символ, який використовується в JavaScript для створення ітерованих об'єктів, тобто тих, які можна ітерувати за допомогою for...of, оператора розгортання (...), або використовувати в інших випадках, де потрібен ітерований інтерфейс.
Ітеровані об'єкти
Об'єкти, які мають метод з ключем Symbol.iterator, вважаються ітерованими. Це:
- масиви
[] - рядки
"hello" - множини
Set - мапи
Map arguments- та інші вбудовані колекції
Приклад:
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— булеве значення, яке вказує, чи завершено ітерування
Приклад кастомного ітератора
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
}Чому ви не можете ітерувати звичайні об'єкти?
const obj = { a: 1, b: 2 };
for (const key of obj) {
// TypeError: obj is not iterable
}Об'єкти за замовчуванням не є ітерованими, оскільки не мають методу [Symbol.iterator].
Щоб зробити об'єкт ітерованим, потрібно явно визначити цей метод.
Де використовується Symbol.iterator
for...ofspread (...)Array.from()Promise.allSetMapдеструктуризація: [...something]
Висновок
Symbol.iteratorє ключем до ітерованості.- Будь-який об'єкт, що реалізує
[Symbol.iterator], може бути використаний уfor...of. - Ви можете створювати свої власні структури даних, що підтримують ітерацію відповідно до вашого сценарію.
Факт:
Symbol.iterator — це те, що робить можливими конструкції, такі як for...of, ...spread, і навіть yield* у генераторах.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.