CodeBlanks Logo Icon CodeBlanks

Symbol.iterator ile özel davranış

JavaScript kursu · Uzman · Ders 39/63

Symbol.iterator ile bir nesneye özel iterasyon davranışı eklemeyi öğrenirsin.

Symbol.iterator ile özel davranış

Bir nesneyi for...of ile dolaşılabilir yapmak için [Symbol.iterator] metodunu tanımlarsın. Bu, iterasyon protokolünü uygulamaktır: nesne bir iterator döndürür, iterator da her adımda { value, done } şeklinde sonuç verir.

Bu bir metaprogramlama aracıdır: çünkü for...of, spread ve Array.from gibi yapılar bu metodu dolaylı olarak çağırır. Sen metodu yazarsın, motor gerisini yapar.

Böylece bir aralık, bir kelime listesi veya bir kayıt kümesi sıradan bir dizi gibi dolaşılabilir olur.

Iterasyon protokolü

Iterasyon protokolü iki parçalıdır. Iterable, [Symbol.iterator] metoduna sahip nesnedir. Iterator, next() metoduna sahip nesnedir ve her çağrıda { value, done } döndürür.

Tipik desen: [Symbol.iterator]() { let i = ...; return { next() { ... } }; }. Buradaki i durumu kapanışta (closure) tutulur; her next() çağrısı onu bir ileri taşır.

done: true üretildiğinde döngü sonlanır. Bundan sonraki çağrılar da aynı sonucu verecek şekilde yazılmalıdır.

Uygulama Aralığı dolaşılabilir yap

range adında from: 1 ve to: 3 özellikleri olan bir nesne tanımla. [Symbol.iterator]() metodu ekle: let current = this.from ile başlat, const last = this.to al ve bir next() metodu döndür. next, current <= last ise { value: current++, done: false }, değilse { value: undefined, done: true } döndürsün. En son for (const n of range) ile dönüp her değeri collected.push(n) ile topla ve console.log(collected) yaz.

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

Kendini test et

  1. [Symbol.iterator] ne döndürmelidir?

    • Bir sayı
    • Bir dizi
    • Bir string
    • Bir iterator nesnesi (next metodu ile)
    Cevabı göster

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

  2. Iterator'ı tamamla

    const range = {
      [Symbol.iterator]() {
        let current = 1;
        return {
          ____() {
            return { value: current++, done: false };
          }
        };
      }
    };
    Cevabı göster
    const range = {
      [Symbol.iterator]() {
        let current = 1;
        return {
          next() {
            return { value: current++, done: false };
          }
        };
      }
    };
  3. Kavramı görevine eşle

    next()
    Sonraki değeri üretir
    done
    Döngüyü bitirir
    value
    Adımın değeri
    Symbol.iterator
    Iterable yapar

Uzman bölümündeki tüm dersler