ArrayBuffer, TypedArray
Web-ishlab chiqishda biz ko'pincha ikkilik (binary) ma'lumot bilan ishlashga to'g'ri kelamiz โ rasm fayllari, tarmoqdan kelgan baytlar, arxivlar va hokazo. JavaScriptda bularning barchasi zamirida ArrayBuffer turadi: bu โ belgilangan uzunlikdagi xom baytlar saqlanadigan xotira bloki. Buferning o'zi bilan bevosita ishlab bo'lmaydi โ uning ustiga ko'rinish (view), ya'ni TypedArray yoki DataView qo'yiladi.
ArrayBuffer โ xom xotira bloki
ArrayBuffer โ konstruktor bo'lib, u belgilangan baytlar sonidan iborat, nol bilan to'ldirilgan uzluksiz xotira maydonini yaratadi:
Bu yerda 16 baytlik maydon ajratildi va u nollar bilan to'ldirildi. byteLength xususiyati buferning uzunligini (baytlarda) qaytaradi.
ArrayBuffer โ bu oddiy massiv emas! Uni Array bilan aralashtirmang. Muhim farqlar: uning uzunligi qat'iy belgilangan (o'zgartirib bo'lmaydi), u aynan shuncha baytni band qiladi, va uning elementiga buffer[0] deb murojaat qilib bo'lmaydi. ArrayBuffer โ bu shunchaki xotira bo'lagi, unda nima saqlanayotgani noma'lum, u faqat baytlar ketma-ketligi.Buferdagi baytlarga kirish uchun bizga ko'rinish obyekti kerak. Ko'rinish o'zida hech qanday ma'lumot saqlamaydi โ u faqat buferdagi baytlarni qanday talqin qilishni belgilaydigan "oyna"dir.
TypedArray ko'rinishlari
Ko'rinishlarning umumiy nomi โ TypedArray (turlangan massiv). Bu bitta konstruktor emas, balki bir necha konstruktorlarning umumiy nomi. Ular buferdagi baytlarni turli formatlarda talqin qiladi:
Uint8Arrayโ har bir element bitta bayt (8 bit), 0..255 oralig'idagi butun son;Uint16Arrayโ har bir element 2 bayt (16 bit), 0..65535;Uint32Arrayโ har bir element 4 bayt (32 bit), 0..4294967295;Int8Array,Int16Array,Int32Arrayโ ishorali (musbat/manfiy) butun sonlar;Uint8ClampedArrayโ 0..255, lekin chegaradan chiqqan qiymatni "kesib" chegaraga tenglaydi (rasm bilan ishlashda qulay);Float32Array,Float64Arrayโ kasrli (suzuvchi nuqtali) sonlar, 4 va 8 bayt.
Nomdagi son bitlar sonini bildiradi. Masalan, Uint16Array โ har bir raqamga 16 bit (2 bayt) ajratadi. Shu sabab 16 baytlik bufer Uint16Array orqali 8 ta element, Uint32Array orqali 4 ta element bo'lib ko'rinadi:
length โ ko'rinishdagi elementlar soni, byteLength esa baytlar soni. Ular har xil ko'rinishlar uchun turlicha bo'ladi, chunki har bir element turli miqdorda bayt egallaydi.Indeks bilan ishlash
TypedArray oddiy massivga juda o'xshaydi: unga indeks orqali murojaat qilish, qiymat yozish va o'qish mumkin:
Uint8Array faqat 0..255 saqlaydi. Agar chegaradan chiqqan qiymat yozsangiz, u xatolik bermaydi, balki ortiqcha bitlar tashlanadi. Yuqorida 300 sonining faqat quyi 8 biti saqlanib, natija 44 bo'ldi (300 - 256 = 44). Bu "o'ralib qolish" (overflow) deyiladi.Agar Uint8ClampedArray ishlatilsa, chegaradan chiqqan qiymat kesiladi (0 dan pastini 0 ga, 255 dan yuqorisini 255 ga):
Bufer va ko'rinish bir xotirani baham ko'radi
Bu โ eng muhim tushunchalardan biri. Bir xil buferga bir nechta ko'rinish qo'yish mumkin. Ular bitta xotirani ko'rsatadi, shuning uchun biri orqali yozilgan bayt boshqasi orqali darhol ko'rinadi:
Har bir TypedArrayning buffer xususiyati orqali uning asosidagi ArrayBufferga yetib borish mumkin. Shu bilan bir buferga yangi ko'rinish qo'shsa bo'ladi:
new Uint8Array(buffer); (2) uzunlik berish โ new Uint8Array(8), bunda ichida yangi bufer avtomatik yaratiladi. Ikkinchi holatda ham arr.buffer mavjud bo'ladi.TypedArray metodlari
TypedArray oddiy Arrayning deyarli barcha metodlarini qo'llab-quvvatlaydi: map, forEach, filter, reduce, find, slice, indexOf va hokazo:
Lekin ba'zi metodlar yo'q: push, pop, shift, unshift, splice โ chunki bular massiv uzunligini o'zgartiradi, TypedArray uzunligi esa qat'iy (buferga bog'liq).
Muhim maxsus metod โ set. U bitta TypedArrayning barcha qiymatlarini boshqasiga (yoki oddiy massivni) berilgan pozitsiyadan boshlab ko'chiradi:
Yana bir metod โ subarray. U ma'lumotni nusxalamasdan, xuddi shu buferning bir qismiga yangi ko'rinish qaytaradi (ular xotirani baham ko'radi):
slice va subarray farqi: slice ma'lumotni nusxalaydi (yangi bufer), subarray esa faqat yangi oyna beradi (bir xil bufer). Xotira tejash kerak bo'lsa subarray tezroq va arzonroq.DataView โ moslashuvchan ko'rinish
DataView โ buferga eng past darajadagi, eng moslashuvchan kirish usuli. TypedArraydan farqi: DataViewda format oldindan qat'iy belgilanmaydi. Aksincha, har bir o'qish/yozishda formatni siz o'zingiz aytasiz โ getUint8, getInt32, getFloat64 va hokazo:
DataViewning asosiy afzalligi โ bitta buferda turli formatdagi ma'lumotlarni aralash saqlash mumkin. Masalan, tarmoq protokoli yoki fayl formati sarlavhasi: dastlabki 2 bayt โ versiya (Uint16), keyingi 4 bayt โ o'lcham (Uint32) va hokazo. Bunday holatda DataView ideal.
DataView metodlarida yana bir muhim parametr bor โ little-endian / big-endian (baytlar tartibi). Ko'p baytli sonlar xotirada ikki xil tartibda saqlanishi mumkin. Uchinchi argument true berilsa little-endian ishlatiladi:
Xulosa
ArrayBufferโ belgilangan uzunlikdagi xom baytlar bloki; u bilan bevosita ishlab bo'lmaydi;- Ma'lumotga kirish uchun ko'rinish kerak:
TypedArrayyokiDataView; Uint8Array,Int32Array,Float64Arrayva boshqalar โ baytlarni ma'lum formatda talqin qiladi;- Bir buferga bir nechta ko'rinish qo'yilsa, ular bitta xotirani baham ko'radi;
- TypedArrayda
map,set,subarraybor, lekinpush/popyo'q; DataViewโ har bir amalda formatni tanlash imkonini beruvchi eng moslashuvchan ko'rinish.