Apakah iterable sama dengan iterator, atau mereka berbeda?
Tampaknya, dari spesifikasinya , iterable adalah objek, katakanlah, obj
sedemikian rupa yang obj[Symbol.iterator]
merujuk ke fungsi, sehingga ketika dipanggil, mengembalikan objek yang memiliki next
metode yang dapat mengembalikan {value: ___, done: ___}
objek:
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)
Jadi dalam kode di atas, bar
apakah iterable, dan wah
iterator, dan itu next()
adalah antarmuka iterator.
Jadi, iterable dan iterator adalah hal yang berbeda.
Sekarang, dalam contoh umum generator dan iterator:
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
Dalam kasus di atas, gen1
generator, dan iter1
iterator, dan iter1.next()
akan melakukan pekerjaan yang tepat. Tetapi iter1[Symbol.iterator]
apakah memberikan fungsi itu, ketika dipanggil, memberikan kembali iter1
, yang merupakan iterator. Jadi iter1
apakah keduanya iterable dan iterator dalam kasus ini?
Selain itu, iter1
berbeda dari contoh 1 di atas, karena iterable pada contoh 1 dapat memberikan [1, 3, 5]
sebanyak yang diinginkan menggunakan [...bar]
, sementara iter1
iterable, tetapi karena ia mengembalikan dirinya sendiri, yang merupakan iterator yang sama setiap kali, hanya akan memberikan [1, 3, 5]
satu kali.
Jadi kita dapat mengatakan, untuk iterable bar
, berapa kali dapat [...bar]
memberikan hasil [1, 3, 5]
- dan jawabannya adalah, itu tergantung. Dan apakah iterable sama dengan iterator? Dan jawabannya adalah, mereka adalah hal yang berbeda, tetapi mereka bisa sama, ketika iterable menggunakan dirinya sebagai iterator. Apakah itu benar?
iter1
apakah keduanya iterable dan iterator dalam kasus ini? " - ya. Semua iterator asli juga dapat diubah dengan mengembalikan diri mereka sendiri, sehingga Anda dapat dengan mudah mengirimkannya ke dalam konstruksi yang mengharapkan iterable.