Iterator protocol
Iterable, iterator, next(), dan membuat custom iterable.
Pahami konsepnya
Protokol iterator adalah kontrak di balik for-of, spread, dan destructuring. Sebuah objek adalah ITERABLE bila punya method [Symbol.iterator]() yang mengembalikan ITERATOR — objek dengan method next() yang menghasilkan { value, done }. done true berarti habis.
Array, String, Map, Set, dan NodeList semua iterable — for-of bekerja pada mereka. Objek biasa TIDAK iterable secara bawaan; tambahkan *[Symbol.iterator]() untuk membuatnya.
Memahami protokol ini membuka pemahaman generator (yang otomatis menghasilkan iterator), async iterator (for-await-of), dan cara membuat struktur data custom yang bisa di-spread dan di-destructure.
Coba contoh kode
// manual: memanggil next()
const arr = ["a", "b", "c"];
const it = arr[Symbol.iterator]();
console.log(it.next()); // {value: "a", done: false}
console.log(it.next()); // {value: "b", done: false}
console.log(it.next()); // {value: "c", done: false}
console.log(it.next()); // {value: undefined, done: true}
// custom iterable
class Rentang {
constructor(awal, akhir) { this.awal = awal; this.akhir = akhir; }
*[Symbol.iterator]() {
for (let i = this.awal; i <= this.akhir; i++) yield i;
}
}
const r = new Rentang(1, 5);
console.log([...r]); // [1,2,3,4,5]
for (const n of r) console.log(n);next() menghasilkan objek { value, done } — done true menandakan iterator habis. Rentang custom bisa di-spread dan di-for-of karena punya Symbol.iterator generator.
Latihan singkat
Uji: class Rentang(1,5) dengan Symbol.iterator — [...r] harus `[1,2,3,4,5]`.