JavaScript
Özet - Iterator'lar
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
-
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.
-
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 };
}
};
}
};
}
Sıradaki ders: Generator fonksiyonlar