JavaScript Итерируемые объекты
Объекты, которые можно повторять с помощью for..of
называются итерируемыми.
Технически итерируемые объекты должны реализовывать метод Symbol.iterator
.
Итерация по строке
Вы можете использовать цикл for..of
для перебора элементов строки:
Пример
for (const x of "W3Schools") {
// блок кода, который должен быть выполнен
}
Попробуйте сами »
Итерация по массиву
Вы можете использовать цикл 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;
// Любой код здесь
}
Попробуйте сами »