Чи ітератор такий самий, як ітератор, чи вони різні?
З специфікацій , здається, ітерабельний об'єкт, скажімо, 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
чи є в цьому випадку ітератор і ітератор? " - так. Усі ітератори також можна повторити, повернувшись, так що ви можете легко передати їх у конструкції, які очікують на повторення.