CodeBlanks Logo Icon CodeBlanks

Özel iterator oluşturma

JavaScript kursu · İleri seviye · Ders 45/100

Bir nesneye Symbol.iterator ekleyerek özel iterator oluşturmayı öğrenirsin.

Özel iterator oluşturma

Kendi iterator'ünü yazmak için bir nesneye [Symbol.iterator] eklersin. Metodun içinde let ile bir durum değişkeni tanımlarsın; bu değişken döngü boyunca nerede olduğunu hatırlar. Döndürdüğün iç nesnenin next() metodu bu değişkeni okur ve bir adım ilerletir.

Bu desene stateful iterator denir. Durum değişkeni [Symbol.iterator] çağrıldığında yaratılır; her döngü kendi durumuna sahip olur. Bu sayede aynı iterable'ı bağımsız biçimde birden fazla kez gezebilirsin.

Closure ile durum

[Symbol.iterator] içinde let ile tanımladığın değişken, döndürülen iterator nesnesinin next() metodu tarafından closure ile yakalanır. Her next() çağrısı aynı değişkene erişir ve değerini günceller; böylece durum adım adım ilerler.

Her [Symbol.iterator] çağrısı yeni bir let yaratır. Yani aynı iterable'dan alınan iki iterator birbirini etkilemez. Bu, bağımsız döngüler için kritik bir ayrımdır.

Uygulama Sayı aralığı iterable'ı

range adında bir nesne oluştur; from ve to özellikleri olsun (örn. 1 ve 5). Nesneye [Symbol.iterator] ekle. Metodun içinde let current = this.from; ile durumu başlat. Döndürülen iterator'ün next() metodu current <= this.to iken { value: current++, done: false }, aksi halde { value: undefined, done: true } dönsün. Sonra for...of ile sayıları console.log ile yazdır.

Örnek çözümü göster
const range = {
  from: 1,
  to: 5,
  [Symbol.iterator]() {
    let current = this.from;
    const to = this.to;
    return {
      next() {
        if (current <= to) {
          return { value: current++, done: false };
        }
        return { value: undefined, done: true };
      }
    };
  }
};
for (const num of range) {
  console.log(num);
}

Kendini test et

  1. Özel bir iterator'da [Symbol.iterator] ne döndürmeli?

    • Bir iterator nesnesi (next metodu olan)
    • Bir sayı
    • Bir dizi
    • Bir dize
    Cevabı göster

    Bir iterator nesnesi (next metodu olan) — Doğru. [Symbol.iterator] next() metodu olan bir iterator döndürür.

  2. Durum değişkenini tanımla

    const range = {
      from: 1,
      to: 5,
      [Symbol.iterator]() {
        ____
        return {
          next() {
            if (this.to >= current) {
              return { value: current++, done: false };
            }
            return { done: true };
          }
        };
      }
    };
    Cevabı göster
    const range = {
      from: 1,
      to: 5,
      [Symbol.iterator]() {
        let current = this.from;
        return {
          next() {
            if (this.to >= current) {
              return { value: current++, done: false };
            }
            return { done: true };
          }
        };
      }
    };
  3. Özel iterator kavramları

    [Symbol.iterator]
    Iterator üreten metod
    let current
    Closure'da tutulan durum
    next()
    Bir adım ilerletir
    done: true
    Tükenme bilgisi

İleri seviye bölümündeki tüm dersler