JavaScript Ітеровані об’єкти
Об’єкти, які можна повторювати за допомогою for..of
називаються ітерованими.
Технічно ітеровані об’єкти повинні реалізовувати метод Symbol.iterator
.
Ітерація по рядку
Ви можете використовувати цикл for..of
для перебору елементів рядка:
Ітерація по масиву
Ви можете використовувати цикл for..of
для перебору елементів масиву:
JavaScript Ітератори
Протокол ітератора визначає, як створити послідовність значень із об’єкта.
Об’єкт стає ітератором, коли він реалізує метод next()
.
Метод next()
має повертати об’єкт з двома властивостями:
- значення (наступне значення)
- виконано (вірно або невірно)
значення | значення, що повертається ітератором (може бути опущено, якщо зроблено вірно) |
---|---|
зроблено | true якщо ітератор завершився false якщо ітератор створив нове значення |
Саморобна ітерабельність
Ця ітерація повертає безкінечне число разів: 10,20,30,40,.... Кожен раз викликається next()
:
Приклад
// Саморобний ітерабельний
function myNumbers() {
let n = 0;
return {
next: function() {
n += 10;
return {value:n, done:false};
}
};
}
// Створити ітерабельний
const n = myNumbers();
n.next(); // поверне 10
n.next(); // поверне 20
n.next(); // поверне 30
Спробуйте самі »
Проблема з саморобним ітерабельним:
Він не підтримує JavaScript інструкцію for..of
.
Ітерований об’єкт JavaScript - це об’єкт, що має Symbol.iterator.
Symbol.iterator
- це функція, яка повертає функцію next()
.
Ітерацію можна повторювати за допомогою коду: for (const x of iterable) { }
Приклад
// Створити об’єкт
myNumbers = {};
// Зробити його ітерованим
myNumbers[Symbol.iterator] = function() {
let n = 0;
done = false;
return {
next() {
n += 10;
if (n == 100) {done = true}
return {value:n, done:done};
}
};
}
Тепер ви можете використовувати for..of
for (const num of myNumbers) {
// Будь-який код тут
}
Спробуйте самі »
Метод Symbol.iterator викликається автоматично for..of
.
Але також це можна зробити "вручну":
Приклад
let iterator = myNumbers[Symbol.iterator]();
while (true) {
const result = iterator.next();
if (result.done) break;
// Будь-який код тут
}
Спробуйте самі »