Yinelenebilir bir yineleyici ile aynı mıdır yoksa farklı mıdır?
Spesifikasyonlardan , yinelenebilir bir nesne, obj
örneğin obj[Symbol.iterator]
bir işleve atıfta bulunacak şekilde bir nesne gibi görünüyor, böylece çağrıldığında bir nesneyi next
döndürebilecek bir yöntemi olan bir nesneyi döndürüyor {value: ___, done: ___}
:
function foo() {
let i = 0;
const wah = {
next: function() {
if (i <= 2) return { value: (1 + 2 * i++), done: false }
else return { value: undefined, done: true }
}
};
return wah; // wah is iterator
}
let bar = {} // bar is iterable
bar[Symbol.iterator] = foo;
console.log([...bar]); // [1, 3, 5]
for (a of bar) console.log(a); // 1 3 5 (in three lines)
Yani yukarıdaki kodda bar
, yinelenebilir ve wah
yineleyici ve next()
yineleyici arabirimi.
Yani, yinelenebilir ve yineleyici farklı şeylerdir.
Ancak şimdi, yaygın bir jeneratör ve yineleyici örneğinde:
function* gen1() {
yield 1;
yield 3;
yield 5;
}
const iter1 = gen1();
console.log([...iter1]); // [1, 3, 5]
for (a of iter1) console.log(a); // nothing
const iter2 = gen1();
for (a of iter2) console.log(a); // 1 3 5 (in three lines)
console.log(iter1[Symbol.iterator]() === iter1); // true
Yukarıdaki durumda gen1
, jeneratör ve iter1
yineleyici ve iter1.next()
uygun işi yapacak. Ancak iter1[Symbol.iterator]
, çağrıldığında, iter1
bir yineleyici olan bir işlev verir . Peki iter1
bu durumda hem yinelenebilir hem de yineleyici midir?
Ayrıca, iter1
örnek 1'de verebilir iterable çünkü yukarıdaki örnekte 1 farklıdır [1, 3, 5]
kullanılarak istediği kadar çok kez [...bar]
ederken, iter1
bir iterable, ama aynı yineleyici her zaman olduğu kendisini döndüren beri, sadece verecektir [1, 3, 5]
kez.
Dolayısıyla, yinelenebilir bir şekilde, sonucu bar
kaç kez verebileceğini söyleyebiliriz - ve cevap, duruma bağlıdır. Ve yineleyici bir yineleyici ile aynı mı? Ve cevap, farklı şeylerdir, ancak yinelenebilir kendini yineleyici olarak kullandığında aynı olabilirler. Bu doğru mu?[...bar]
[1, 3, 5]
iter1
bu durumda hem yinelenebilir hem de yineleyici? " - evet. Tüm yerel yineleyiciler de geri dönerek yinelenebilir, böylece bunları yinelenebilir bir yapı bekleyen yapılara kolayca aktarabilirsiniz.