Мы можем сделать обычный (POJSO) JS-объект повторяемым, например, так:
const tempObj = {a: 1, b: 2, c: 3};
tempObj[Symbol.iterator] = function () {
const self = this;
const keys = Object.keys(self);
return {
next() {
const k = keys.shift();
return {
done: !k,
value: [k, self[k]]
}
}
}
};
Теперь мы можем использовать цикл for..of
:
for (let [k,v] of tempObj) {
console.log(k,v);
}
и получаем:
a 1
b 2
c 3
мой вопрос - есть ли другой метод, который нам нужно реализовать, кроме next ()?если нет, почему спецификация итератора решила вернуть объект, а не просто вернуть функцию?почему спецификация не проста:
tempObj[Symbol.iterator] = function () {
return function next {
return {
done: Object.keys(this).length === 0,
value: Object.keys(this).shift()
}
}
};
Я могу только предположить, что, возвращая объект, он оставляет место для обновлений / изменений.