Итерации JavaScript
Итерируемые объекты — это объекты, которые можно повторять с помощью for..of
.
Технически итерации должны реализовывать Symbol.iterator
метод.
Итерация по строке
Вы можете использовать for..of
цикл для перебора элементов строки:
Пример
for (const x of "W3Schools") {
// code block to be executed
}
Итерация по массиву
Вы можете использовать for..of
цикл для перебора элементов массива:
Пример
for (const x of [1,2,3,4,5] {
// code block to be executed
}
Итераторы JavaScript
Протокол итератора определяет, как создать последовательность значений из объекта.
Объект становится итератором , когда он реализует next()
метод.
Метод next()
должен возвращать объект с двумя свойствами:
- значение (следующее значение)
- сделано (правда или ложь)
ценность | Значение, возвращаемое итератором (может быть опущено, если done равно true) |
---|---|
Выполнено |
true , если итератор завершил работу; false , если итератор выдал новое значение. |
Домашнее повторение
Эта итерация никогда не заканчивается: 10,20,30,40,.... Каждый раз
next()
вызывается:
Пример
// Home Made Iterable
function myNumbers() {
let n = 0;
return {
next: function() {
n += 10;
return {value:n, done:false};
}
};
}
// Create Iterable
const n = myNumbers();
n.next(); // Returns 10
n.next(); // Returns 20
n.next(); // Returns 30
Проблема с домом, сделанным итерируемым:
Он не поддерживает for..of
оператор JavaScript.
Итерируемый JavaScript — это объект, который имеет Symbol.iterator .
Это Symbol.iterator
функция, которая возвращает next()
функцию.
Итерируемый объект может быть повторен с помощью кода:for (const x of iterable) { }
Пример
// Create an Object
myNumbers = {};
// Make it Iterable
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) {
// Any Code Here
}
Метод Symbol.iterator вызывается автоматически for..of
.
Но мы также можем сделать это «вручную»:
Пример
let iterator = myNumbers[Symbol.iterator]();
while (true) {
const result = iterator.next();
if (result.done) break;
// Any Code Here
}