Iteratsiyalanuvchi obyektlar (iterable)
Iteratsiyalanuvchi (iterable) obyektlar โ massiv tushunchasining umumlashtirilgan ko'rinishi. Bu for..of siklida ishlatib bo'ladigan har qanday obyekt. Massivlar, satrlar va boshqa ko'p tuzilmalar iterable hisoblanadi.
Muammo: o'z obyektimizni iterable qilish
Aytaylik, bizda massiv emas, oddiy obyekt bor, lekin uni for..of bilan aylanib chiqmoqchimiz. Masalan, from dan to gacha sonlar diapazoni:
let range = {
from: 1,
to: 5
};
// biz shuni istaymiz:
// for (let num of range) ... 1, 2, 3, 4, 5
Buni ishlashi uchun obyektga maxsus metod โ Symbol.iterator qo'shishimiz kerak.
Symbol.iterator
Symbol.iterator โ maxsus o'rnatilgan simvol. U obyektning iteratsiyasini boshqaradigan metod nomi bo'lib xizmat qiladi. Ushbu metod iterator deb ataladigan obyekt qaytarishi kerak โ unda next() metodi bo'ladi.
next() chaqirilganda { value: ..., done: ... } ko'rinishidagi obyekt qaytaradi. done: false โ iteratsiya davom etadi, done: true โ tugadi.
range obyektining o'zida next yo'q. Uning o'rniga Symbol.iterator chaqiruvi bilan alohida iterator obyekt yaratiladi va aynan u iteratsiyani boshqaradi. Shu tufayli bir obyekt bo'yicha bir vaqtda bir nechta mustaqil for..of ishlashi mumkin.for..of aslida qanday ishlaydi?
for (let x of obj) ishga tushganda quyidagilar sodir bo'ladi:
obj[Symbol.iterator]()bir marta chaqiriladi โ u iterator obyektni qaytaradi (bo'lmasa xatolik).- Keyin har bir qadamda iteratorning
next()metodi chaqiriladi. next()qaytargan natijaningvalueqiymatixga yoziladi.- Agar
done: truebo'lsa, sikl to'xtaydi. Aks holdavalueishlatiladi va keyinginext()chaqiriladi.
Iteratorni qo'lda ham chaqirsak bo'ladi, bu jarayonni oydinlashtiradi:
String ham iterable
Massivlar va satrlar โ eng ko'p ishlatiladigan o'rnatilgan iterable'lar. for..of satr bo'yicha harfma-harf yuradi va u surrogat juftliklar (masalan, ba'zi emoji va maxsus belgilar) bilan ham to'g'ri ishlaydi.
Array.from โ har qanday iterable'ni massivga aylantirish
Global metod Array.from(obj) iterable yoki massivsimon obyektni oladi va undan haqiqiy massiv yasaydi. Shundan so'ng unda barcha massiv metodlarini ishlatish mumkin.
Array.from ixtiyoriy ikkinchi argument โ map funksiyasini oladi. Har bir element massivga qo'shilishdan oldin shu funksiyadan o'tadi:
0, 1, 2...) va length xususiyatiga ega, lekin Symbol.iterator ga ega bo'lmagan obyekt. Array.from ham iterable, ham massivsimon obyektlar bilan ishlaydi โ bu uning katta afzalligi.Array.from(str). U str.split('') dan farqli o'laroq murakkab Unicode belgilarni ham to'g'ri ajratadi.Xulosa
- Iterable โ
Symbol.iteratormetodini amalga oshirgan obyekt; unifor..ofbilan aylanib chiqish mumkin; Symbol.iteratornext()metodiga ega iterator qaytaradi;next()har chaqiruvda{ value, done }qaytaradi;done: trueโ tugash belgisi;- Massiv va satr โ o'rnatilgan iterable'lar; satr Unicode belgilarni to'g'ri aylanadi;
Array.from(obj)iterable yoki massivsimon obyektni haqiqiy massivga aylantiradi (ixtiyoriy map funksiyasi bilan).