JavaScript generator va iterator
for...of massiv, matn va Map bilan bir xil ishlaydi. Buning ortida
iterator protokoli turadi — va uni o’z obyektlaringizga ham qo’shish
mumkin.
Iterator protokoli
for...of aslida shu ishni bajaradi — done: true bo’lguncha next()
chaqiradi.
Qo’lda iterator yozish
Endi obyekt for...of va spread bilan ishlaydi.
Ammo yozuv uzun — generator buni ancha qisqartiradi.
Generator — birinchi tanishuv
Pauza qanday ishlaydi
Funksiya tanasi next() chaqirilmaguncha umuman ishga tushmadi. Bu —
oddiy funksiyadan asosiy farq.
Generator ham iterable
Yuqoridagi qo’lda yozilgan iterator bilan solishtiring — bir xil natija, uch barobar qisqa kod.
Obyektga qo’shish
Cheksiz ketma-ketlik
Generator qiymatni talab bo’yicha beradi, shuning uchun cheksiz bo’lishi mumkin:
Cheklovchi yordamchi
Generatorlarni bir-biriga ulash mumkin — har biri qiymatni kerak bo’lganda hisoblaydi. Massiv bilan bunday qilish uchun avval butun ro’yxatni yasash kerak bo’lardi.
yield* — boshqa generatorni qo’shish
Generatorga qiymat berish
next(qiymat) — yield natijasiga aylanadi:
Ikki tomonlama aloqa: generator qiymat beradi va qabul qiladi.
Amaliy foyda — katta ma’lumot
Birinchi usul million elementni xotirada yasadi; ikkinchisi bitta qiymat hisoblab to’xtadi.
Amaliy mashq
Symbol.iterator]()ni qo’lda chaqirib,next()bilan yuring;function*bilan uch qiymat beruvchi generator yozing;for...ofva spread bilan ishlatib ko’ring;- obyektga
*[Symbol.iterator]qo’shing; - Fibonachchi generatorini yozib, birinchi 10 sonini oling;
yield*bilan ikki generatorni birlashtiring.
Qisqacha xulosa
- Iterator —
next()bilan{ value, done }qaytaruvchi obyekt. - Iterable —
Symbol.iteratorbo’lgan obyekt;for...ofshuni talab qiladi. - Generator (
function*)yieldda to’xtaydi vanext()da davom etadi. - Generator tanasi
next()chaqirilmaguncha ishga tushmaydi. - Cheksiz ketma-ketlik yasash mumkin — qiymat talab bo’yicha hisoblanadi.
yield*boshqa generatorni ichiga qo’shadi.
Keyingi darsda funksional dasturlash tamoyillari.