← Kembali ke kursus
Pelajaran kursus · JavaScript
Pelajaran 16

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]`.