CodeBlanks Logo Icon CodeBlanks

Özet - Iterator'lar

JavaScript kursu · İleri seviye · Ders 47/100

Symbol.iterator kullanarak bir sayı aralığı iterable nesnesi yazarsın.

Özet - Iterator'lar

Bu grupta iterator protokolünü, iterable protokolünü ve özel iterator yazmayı öğrendin. Bir iterator next() metoduyla { value, done } döndürür. Bir nesne [Symbol.iterator] ekleyince iterable olur; for...of, spread ve destructuring ile kullanılabilir.

Özel iterator yazarken let ile durum tutar, closure ile next() içinde yaşatırız. Her [Symbol.iterator] çağrısı taze bir iterator üretir; böylece aynı iterable bağımsız biçimde birden fazla kez gezilir.

İpuçları ve yaygın tuzaklar

Bir iterator tükendikten sonra tekrar next() yaparsan hep { value: undefined, done: true } alırsın; hata fırlatılmaz. Yeni bir döngü başlatmak için iterator'ı değil, iterable'ı kullan; çünkü iterator tek kullanımlıktır.

for...in ile for...of'u karıştırma: ilki nesne anahtarlarını, ikincisi değerleri gezer. Ayrıca null ve undefined iterable değildir; for...of hata fırlatır.

Uygulama Adımlı sayı aralığı

makeRange(start, end, step) adında bir fonksiyon yaz. Fonksiyon iterable bir nesne döndürmeli: [Symbol.iterator] metodu let current = start ile başlasın ve bir iterator döndürsün. Iterator'ün next() metodu current <= end iken { value, done: false } dönsün, her adımda current'i step kadar artırsın; aksi halde { value: undefined, done: true } dönsün. Sonra makeRange(1, 10, 2) ile bir range oluştur, for...of ile sayıları yazdır ve [...range] ile diziye çevirip uzunluğunu yazdır.

Örnek çözümü göster
function makeRange(start, end, step) {
  return {
    [Symbol.iterator]() {
      let current = start;
      return {
        next() {
          if (current <= end) {
            const value = current;
            current += step;
            return { value, done: false };
          }
          return { value: undefined, done: true };
        }
      };
    }
  };
}
const range = makeRange(1, 10, 2);
for (const num of range) {
  console.log(num);
}
const arr = [...range];
console.log(arr.length);

Kendini test et

  1. Bir nesneyi iterable yapmak için ne eklemelisin?

    • toString metodu
    • [Symbol.iterator] metodu
    • length özelliği
    • valueOf metodu
    Cevabı göster

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

  2. makeRange'i iterable yap

    function makeRange(start, end, step) {
      return {
        ____() {
          let current = start;
          return {
            next() {
              if (end >= current) {
                const value = current;
                current += step;
                return { value, done: false };
              }
              return { value: undefined, done: true };
            }
          };
        }
      };
    }
    Cevabı göster
    function makeRange(start, end, step) {
      return {
        [Symbol.iterator]() {
          let current = start;
          return {
            next() {
              if (end >= current) {
                const value = current;
                current += step;
                return { value, done: false };
              }
              return { value: undefined, done: true };
            }
          };
        }
      };
    }

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