CodeBlanks Logo Icon CodeBlanks

Iterable protokolü

JavaScript kursu · İleri seviye · Ders 43/100

Symbol.iterator ile bir nesnenin nasıl iterable olduğunu öğrenirsin.

Iterable protokolü

Bir nesneyi iterable yapmak için [Symbol.iterator] metodunu tanımlarsın. Bu metod bir iterator döndürür; yani next() metodu olan bir nesne. JavaScript for...of gördüğünde önce bu metodu çağırır, sonra her adımda next() ile değer çeker.

Bu düzene iterable protokolü denir. Diziler, dizeler, Map ve Set zaten bu metoda sahiptir. Kendi nesnelerine de ekleyerek onları for...of, spread (...) ve destructuring ile kullanılabilir kılarız.

Iterator fabrikası

[Symbol.iterator] bir fabrika gibi çalışır: her çağrıda yeni bir iterator döndürür. Böylece aynı iterable'ı birden fazla kez bağımsız biçimde gezebilirsin. İçinde let ile bir durum değişkeni tutup her next() çağrısında bir adım ilerlersin.

Iterator tükendiğinde { value: undefined, done: true } döner. for...of bu noktada durur. Fabrika deseninin gücü: her döngü kendi başlangıç durumuyla başlar, önceki döngüden etkilenmez.

Uygulama Listeyi iterable yap

list adında bir nesne oluştur; items özelliği üç elemanlı bir dizi olsun. Nesneye [Symbol.iterator] metodu ekle. Bu metod bir iterator döndürmeli: let i = 0 ile başlayıp her next() çağrısında bir sonraki elemanı { value, done: false } olarak vermeli, dizi bitince { value: undefined, done: true } dönmeli. Sonra for...of ile elemanları console.log ile yazdır.

Örnek çözümü göster
const list = {
  items: ["elma", "armut", "kiraz"],
  [Symbol.iterator]() {
    let i = 0;
    const items = this.items;
    return {
      next() {
        if (i < items.length) {
          return { value: items[i++], done: false };
        }
        return { value: undefined, done: true };
      }
    };
  }
};
for (const item of list) {
  console.log(item);
}

Kendini test et

  1. Bir nesneyi iterable yapmak için hangi metodu tanımlamalısın?

    • [Symbol.iterator]
    • [Symbol.iterator()]
    • iterator()
    • Symbol()
    Cevabı göster

    [Symbol.iterator] — Doğru. [Symbol.iterator] metodu nesneyi iterable yapar.

  2. Iterable metodunu ekle

    const list = {
      items: ["a", "b"],
      ____() {
        let i = 0;
        const items = this.items;
        return {
          next() {
            return items.length > i
              ? { value: items[i++], done: false }
              : { value: undefined, done: true };
          }
        };
      }
    };
    Cevabı göster
    const list = {
      items: ["a", "b"],
      [Symbol.iterator]() {
        let i = 0;
        const items = this.items;
        return {
          next() {
            return items.length > i
              ? { value: items[i++], done: false }
              : { value: undefined, done: true };
          }
        };
      }
    };
  3. Iterable protokolü kavramları

    Symbol.iterator
    Iterator üreten metod
    iterable
    Symbol.iterator'ı olan nesne
    iterator
    next() metodu olan nesne
    fabrika
    Her çağrıda taze iterator

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