Является ли итерация такой же, как итератор, или они разные?
Из спецификаций кажется, что итеративный объект - это, скажем, obj
такой объект, который obj[Symbol.iterator]
ссылается на функцию, поэтому при вызове возвращает объект, у которого есть next
метод, который может вернуть {value: ___, done: ___}
объект:
function foo() {
let i = 0;
const wah = {
next: function() {
if (i <= 2) return { value: (1 + 2 * i++), done: false }
else return { value: undefined, done: true }
}
};
return wah; // wah is iterator
}
let bar = {} // bar is iterable
bar[Symbol.iterator] = foo;
console.log([...bar]); // [1, 3, 5]
for (a of bar) console.log(a); // 1 3 5 (in three lines)
Таким образом, в приведенном выше коде bar
это итерация, wah
итератор, и next()
интерфейс итератора.
Итак, итерируемый и итератор это разные вещи.
Теперь, однако, в общем примере генератора и итератора:
function* gen1() {
yield 1;
yield 3;
yield 5;
}
const iter1 = gen1();
console.log([...iter1]); // [1, 3, 5]
for (a of iter1) console.log(a); // nothing
const iter2 = gen1();
for (a of iter2) console.log(a); // 1 3 5 (in three lines)
console.log(iter1[Symbol.iterator]() === iter1); // true
В приведенном выше случае gen1
это генератор, iter1
итератор, и он iter1.next()
будет выполнять свою работу правильно. Но iter1[Symbol.iterator]
дает функцию, которая при вызове возвращает iter1
, которая является итератором. Так iter1
и в этом случае итеративный и итератор?
Кроме того, iter1
он отличается от приведенного выше примера 1, поскольку итерация в примере 1 может давать [1, 3, 5]
столько раз, сколько требуется [...bar]
при использовании , в то время как iter1
она является итеративной, но поскольку она возвращает себя, то есть каждый раз [1, 3, 5]
один и тот же итератор дает только один раз.
Таким образом, мы можем сказать, для повторения bar
, сколько раз может [...bar]
дать результат [1, 3, 5]
- и ответ, это зависит. И повторяется ли итератор? И ответ таков: это разные вещи, но они могут быть одинаковыми, когда итерируемый использует себя в качестве итератора. Это верно?
iter1
и в этом случае и итеративный и итератор? » - да. Все нативные итераторы также итерируемы, возвращая себя, так что вы можете легко передать их в конструкции, которые ожидают итерацию.