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