У веб-ÑозÑобÑÑ Ð¼Ð¸ маÑмо ÑпÑÐ°Ð²Ñ Ð· бÑнаÑними даними пеÑеважно пÑи ÑобоÑÑ Ð· Ñайлами (ÑÑвоÑеннÑ, виванÑÐ°Ð¶ÐµÐ½Ð½Ñ Ñа заванÑаженнÑ). ÐнÑим ÑаÑÑим випадком Ñ Ð¾Ð±Ñобка зобÑаженÑ.
ÐÑе Ñе Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¸Ð¼ в JavaScript, ба бÑлÑÑе, бÑнаÑÐ½Ñ Ð¾Ð¿ÐµÑаÑÑÑ Ñе й виÑокопÑодÑкÑивнÑ.
ХоÑа й велика кÑлÑкÑÑÑÑ ÑÑÐ·Ð½Ð¸Ñ ÐºÐ»Ð°ÑÑв може ÑпанÑелиÑиÑи. ÐеÑÐºÑ Ð· Ð½Ð¸Ñ :
ArrayBuffer,Uint8Array,DataView,Blob,FileÑоÑо.
ÐÑнаÑÐ½Ñ Ð´Ð°Ð½Ñ Ð² JavaScript ÑеалÑзовано не Ñак, Ñк в ÑнÑÐ¸Ñ Ð¼Ð¾Ð²Ð°Ñ Ð¿ÑогÑамÑваннÑ. Ðле, ÑкÑо ÑÑоÑки ÑозÑбÑаÑиÑÑ, вÑе виÑвиÑÑÑÑ Ð´Ð¾ÑиÑÑ Ð¿ÑоÑÑим.
Ðазовим обâÑкÑом Ð´Ð»Ñ ÑобоÑи з бÑнаÑними даними Ñ ArrayBuffer â поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° непеÑеÑÐ²Ð½Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿Ð°Ð¼âÑÑÑ ÑÑкÑÐ¾Ð²Ð°Ð½Ð¾Ñ Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¸.
ÐаÑив ÑÑвоÑÑÑÑÑÑÑ Ð½Ð°ÑÑÑпним Ñином:
let buffer = new ArrayBuffer(16); // ÑÑвоÑиÑи бÑÑÐµÑ Ð· Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¾Ñ 16
alert(buffer.byteLength); // 16
Це видÑлÑÑ Ð½ÐµÐ¿ÐµÑеÑÐ²Ð½Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿Ð°Ð¼âÑÑÑ Ð· Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¾Ñ 16 Ð±Ð°Ð¹Ñ Ñа заповнÑÑ Ð½ÑлÑми.
ArrayBuffer не Ñ Ð¼Ð°ÑивомÐозбÑдÑмоÑÑ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾Ð³Ð¾ джеÑела непоÑозÑмÑнÑ. ArrayBuffer не Ð¼Ð°Ñ Ð½ÑÑого ÑпÑлÑного з Array:
- ÐÑн Ð¼Ð°Ñ ÑÑкÑÐ¾Ð²Ð°Ð½Ñ Ð´Ð¾Ð²Ð¶Ð¸Ð½Ñ, Ñо не може бÑÑи збÑлÑÑена Ñи зменÑена.
- ÐÑн Ð·Ð°Ð¹Ð¼Ð°Ñ Ñаме ÑÑÑлÑки мÑÑÑÑ, ÑкÑлÑки видÑлено пÑи ÑÑвоÑеннÑ.
- ÐÐ»Ñ Ð´Ð¾ÑÑÑÐ¿Ñ Ð´Ð¾ окÑемиÑ
байÑÑв нам знадобиÑÑÑÑ Ð¾ÐºÑемий обâÑÐºÑ Ð¿ÑедÑÑавленнÑ,
buffer[index]не ÑпÑаÑÑÑ.
ArrayBuffer â облаÑÑÑ Ð¿Ð°Ð¼âÑÑÑ. Що Ñам збеÑÑгаÑÑÑÑÑ? ÐÑоÑÑо поÑлÑдовнÑÑÑÑ Ð±Ð°Ð¹ÑÑв, Ñо можна ÑнÑеÑпÑеÑÑваÑи Ñк нам поÑÑÑбно.
ÐÐ»Ñ ÑобоÑи з ArrayBuffer нам поÑÑÑбен ÑпеÑÑалÑний обâÑÐºÑ âпÑедÑÑавленнÑâ.
ÐлаÑне обâÑÐºÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ збеÑÑÐ³Ð°Ñ Ð½ÑÑкиÑ
даниÑ
. Це âвÑкноâ, Ñо Ð½Ð°Ð´Ð°Ñ Ð¿ÐµÐ²Ð½Ñ ÑнÑеÑпÑеÑаÑÑÑ âÑиÑиÑ
â байÑÑв вÑеÑÐµÐ´Ð¸Ð½Ñ ArrayBuffer.
ÐапÑиклад:
Uint8Arrayâ пÑедÑÑавлÑÑ ÐºÐ¾Ð¶ÐµÐ½ Ð±Ð°Ð¹Ñ Ð²ArrayBufferокÑемим ÑиÑлом Ñз облаÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ñ Ð²Ñд 0 до 255 (Ð±Ð°Ð¹Ñ ÑкладаÑÑÑÑÑ Ð· 8 бÑÑ, ÑÐ¾Ð¼Ñ ÑÑлÑки ÑÐ°ÐºÑ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ñ). Ð¢Ð°ÐºÑ ÑиÑла називаÑÑÑÑÑ â8-бÑÑÐ¾Ð²Ñ Ð±ÐµÐ·Ð·Ð½Ð°ÐºÐ¾Ð²Ñ ÑÑÐ»Ñ ÑиÑлаâ.Uint16Arrayâ пÑедÑÑавлÑÑ ÐºÐ¾Ð¶Ð½Ñ 2 байÑи ÑÑлим ÑиÑлом з облаÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ñ Ð²Ñд 0 до 65535. ÐÐ°Ñ Ð½Ð°Ð·Ð²Ñ â16-бÑÑÐ¾Ð²Ñ Ð±ÐµÐ·Ð·Ð½Ð°ÐºÐ¾Ð²Ñ ÑÑÐ»Ñ ÑиÑлаâ.Uint32Arrayâ пÑедÑÑавлÑÑ ÐºÐ¾Ð¶Ð½Ñ 4 байÑи ÑÑлим ÑиÑлом з облаÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ñ Ð²Ñд 0 до 4294967295. ÐÐ°Ñ Ð½Ð°Ð·Ð²Ñ â32-бÑÑÐ¾Ð²Ñ Ð±ÐµÐ·Ð·Ð½Ð°ÐºÐ¾Ð²Ñ ÑÑÐ»Ñ ÑиÑлаâ.Float64Arrayâ пÑедÑÑавлÑÑ ÐºÐ¾Ð¶Ð½Ñ 8 Ð±Ð°Ð¹Ñ ÑиÑлом з плаваÑÑÐ¾Ñ ÐºÐ¾Ð¼Ð¾Ñ Ð· облаÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ñ Ð²Ñд5.0x10-324до1.8x10308.
ÐÑже, бÑнаÑÐ½Ñ Ð´Ð°Ð½Ñ Ð² 16 байÑÐ½Ð¾Ð¼Ñ ArrayBuffer можна пÑедÑÑавиÑи Ñк 16 âкоÑоÑкиÑ
ÑиÑелâ або 8 бÑлÑÑиÑ
ÑиÑел (2 байÑи кожне), або 4 Ñе бÑлÑÑиÑ
(4 байÑи кожне), або 2 ÑиÑла з плаваÑÑÐ¾Ñ ÐºÐ¾Ð¼Ð¾Ñ Ð²Ð¸ÑÐ¾ÐºÐ¾Ñ ÑоÑноÑÑÑ (8 байÑи кожне).
ArrayBuffer â головний обâÑÐºÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ
, Ñо Ñ Ð¿ÑоÑÑÐ¾Ñ Ð¿Ð¾ÑлÑдовнÑÑÑÑ Ð±Ð°Ð¹ÑÑв.
ЯкÑо нам знадобиÑÑÑÑ ÑоÑÑ ÑÑди запиÑаÑи, пеÑебÑаÑи ÑÑ Ð°Ð±Ð¾ Ð´Ð»Ñ Ð±ÑдÑ-ÑÐºÐ¾Ñ ÑнÑÐ¾Ñ Ð¾Ð¿ÐµÑаÑÑÑ â нам знадобиÑÑÑÑ Ð¾Ð±âÑÐºÑ Ð¿ÑедÑÑавленнÑ:
let buffer = new ArrayBuffer(16); // ÑÑвоÑÐµÐ½Ð½Ñ Ð±ÑÑеÑÑ Ð· Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¾Ñ 16
let view = new Uint32Array(buffer); // пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ Ð±ÑÑеÑÑ Ð¿Ð¾ÑлÑдовнÑÑÑÑ 32-бÑÑовиÑ
ÑÑлиÑ
ÑиÑел
alert(Uint32Array.BYTES_PER_ELEMENT); // 4 байÑи на кожне ÑиÑло
alert(view.length); // 4, ÑÑÑлÑки ÑиÑел вмÑÑÑÑ Ð±ÑÑеÑ
alert(view.byteLength); // 16, ÑозмÑÑ Ð² байÑаÑ
// запиÑемо ÑÑди знаÑеннÑ
view[0] = 123456;
// пеÑебеÑемо вÑÑ Ð·Ð½Ð°ÑеннÑ
for(let num of view) {
alert(num); // 123456, поÑÑм 0, 0, 0 (вÑÑого 4 знаÑеннÑ)
}
TypedArray
СпÑлÑним ÑеÑмÑном Ð´Ð»Ñ Ð¾Ð¿Ð¸ÑÑ Ð¾Ð±âÑкÑÑв пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ (Uint8Array, Uint32Array ÑоÑо) Ñ TypedArray. ÐÑÑ Ð²Ð¾Ð½Ð¸ маÑÑÑ Ð¾Ð´Ð½Ð°ÐºÐ¾Ð²Ð¸Ð¹ набÑÑ Ð¼ÐµÑодÑв Ñа влаÑÑивоÑÑей.
ÐвеÑнÑÑÑ ÑвагÑ, не ÑÑнÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑÑ Ð· Ñменем TypedArray, Ñе пÑоÑÑо ÑеÑмÑн, Ñо викоÑиÑÑовÑÑÑÑÑÑ Ð´Ð»Ñ Ð¾Ð¿Ð¸ÑÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ ArrayBuffer: Int8Array, Uint8Array Ñ Ñак далÑ.
Ðоли ви баÑиÑе ÑоÑÑ Ð½Ð° кÑÑÐ°Ð»Ñ new TypedArray â Ñе ознаÑÐ°Ñ Ð±ÑдÑ-Ñо з new Int8Array, new Uint8Array ÑоÑо.
ТипÑÐ·Ð¾Ð²Ð°Ð½Ñ Ð¼Ð°Ñиви поводÑÑÑ Ñебе Ñк звиÑÐ°Ð¹Ð½Ñ Ð¼Ð°Ñиви: маÑÑÑ ÑндекÑи Ñа можÑÑÑ Ð¿ÐµÑебиÑаÑиÑÑ.
ÐонÑÑÑÑкÑоÑи ÑипÑзованиÑ
маÑивÑв (Int8Array Ñи Float64Array, Ñе неважливо) поводÑÑÑ Ñебе по-ÑÑÐ·Ð½Ð¾Ð¼Ñ Ð² залежноÑÑÑ Ð²Ñд ÑÐ¸Ð¿Ñ Ð°ÑгÑменÑÑв.
ÐÑнÑÑ 5 ваÑÑанÑÑв ÑигнаÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑÑ:
new TypedArray(buffer, [byteOffset], [length]);
new TypedArray(object);
new TypedArray(typedArray);
new TypedArray(length);
new TypedArray();
-
ЯкÑо пеÑедаÑÑÑÑÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ ÑипÑ
ArrayBuffer, Ñо обâÑÐºÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ ÑÑвоÑÑÑÑÑÑÑ Ð´Ð»Ñ Ð½Ñого. Ðи вже викоÑиÑÑовÑваÑи Ñакий ÑинÑакÑиÑ.ÐеобовâÑÐ·ÐºÐ¾Ð²Ñ Ð°ÑгÑменÑи:
byteOffsetвибоÑÑ Ð·Ð¼ÑÑÐµÐ½Ð½Ñ Ð²Ñд поÑаÑÐºÑ (Ñипове знаÑÐµÐ½Ð½Ñ 0) Ñаlength(Ñипове знаÑÐµÐ½Ð½Ñ Ð²ÑдповÑÐ´Ð°Ñ ÐºÑнÑÑ) â дозволÑÑÑÑ Ð¿ÑаÑÑваÑи з ÑаÑÑÐ¸Ð½Ð¾Ñ Ð´Ð°Ð½Ð¸Ñ Ð·buffer. -
ЯкÑо пеÑедаÑи
ArrayÑи бÑдÑ-Ñкий обâÑÐºÑ ÑÑ Ð¾Ð¶Ð¸Ð¹ на маÑив â Ñе ÑÑвоÑиÑÑ ÑипÑзований маÑив ÑÐ°ÐºÐ¾Ñ Ð¶ довжини Ñ Ð· копÑÑÑ Ð²Ð¼ÑÑÑÑ.Ðи можемо викоÑиÑÑовÑваÑи Ñе Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ð¼Ð°ÑÐ¸Ð²Ñ Ð´Ð°Ð½Ð¸Ð¼Ð¸:
let arr = new Uint8Array([0, 1, 2, 3]); alert( arr.length ); // 4, ÑÑвоÑÑÑÑÑÑÑ Ð±ÑнаÑний маÑив ÑÐ°ÐºÐ¾Ñ Ð¶ довжини alert( arr[1] ); // 1, ÑкладаÑÑÑÑÑ Ð· 4 байÑÑв (8-бÑÑÐ¾Ð²Ñ Ð±ÐµÐ·Ð·Ð½Ð°ÐºÐ¾Ð²Ñ ÑÑÐ»Ñ ÑиÑла) Ñз заданими знаÑеннÑми -
ЯкÑо пеÑедано ÑнÑий
TypedArrayâ Ñе ÑпÑаÑÑÑ Ñаким же Ñином: бÑде ÑÑвоÑено новий ÑипÑзований маÑив ÑÐ°ÐºÐ¾Ñ Ð¶ довжини Ñа копÑÑÑ Ð·Ð½Ð°ÑенÑ. ÐнаÑÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ð²ÐµÑÑÑÑÑÑÑÑ Ð² новий Ñип в пÑоÑеÑÑ, ÑкÑо Ð½ÐµÐ¾Ð±Ñ Ñдно.let arr16 = new Uint16Array([1, 1000]); let arr8 = new Uint8Array(arr16); alert( arr8[0] ); // 1 alert( arr8[1] ); // 232, ÑпÑоба ÑкопÑÑваÑи 1000, але 8 бÑÑ Ð½Ðµ можÑÑÑ Ð²Ð¼ÑÑÑиÑи ÑиÑло 1000 (поÑÑÐ½ÐµÐ½Ð½Ñ Ð½Ð¸Ð¶Ñе) -
Ð ÑиÑловим аÑгÑменÑом
lengthбÑде ÑÑвоÑено ÑипÑзований маÑив Ñз вÑдповÑдним ÑиÑлом елеменÑÑв. Ðого Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¾Ñ Ð² байÑÐ°Ñ Ð±Ñдеlengthпомноженим на кÑлÑкÑÑÑÑ Ð±Ð°Ð¹ÑÑв в Ð¾Ð´Ð½Ð¾Ð¼Ñ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑTypedArray.BYTES_PER_ELEMENT:let arr = new Uint16Array(4); // ÑÑвоÑиÑÑ ÑипÑзований маÑив Ð´Ð»Ñ 4 ÑÑÐ»Ð¸Ñ ÑиÑел alert( Uint16Array.BYTES_PER_ELEMENT ); // 2 Ð±Ð°Ð¹Ñ Ð½Ð° ÑиÑло alert( arr.byteLength ); // 8 (ÑозмÑÑ Ð² байÑÐ°Ñ ) -
Ðез аÑгÑменÑÑв бÑде ÑÑвоÑено ÑипÑзований маÑив нÑлÑÐ¾Ð²Ð¾Ñ Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¸.
TypedArray можна ÑÑвоÑиÑи безпоÑеÑеднÑо, без викоÑиÑÑÐ°Ð½Ð½Ñ ArrayBuffer. Ðле обâÑÐºÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ може ÑÑнÑваÑи без базового ArrayBuffer, ÑÐ¾Ð¼Ñ Ð¹Ð¾Ð³Ð¾ бÑде ÑÑвоÑено авÑомаÑиÑно в ÑÑÑÑ
випадкаÑ
окÑÑм пеÑÑого (коли ArrayBuffer пеÑедано безпоÑеÑеднÑо).
ÐÐ»Ñ Ð´Ð¾ÑÑÑÐ¿Ñ Ð´Ð¾ внÑÑÑÑÑнÑого ArrayBuffer TypedArray Ð¼Ð°Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ:
bufferâ поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð°ArrayBuffer.byteLengthâ довжинаArrayBuffer.
ÐÑже, ми можемо завжди змÑниÑи обâÑÐºÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð° ÑнÑий:
let arr8 = new Uint8Array([0, 1, 2, 3]);
// ÑнÑе пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ Ð¾Ð´Ð½Ð°ÐºÐ¾Ð²Ð¸Ñ
даниÑ
let arr16 = new Uint16Array(arr8.buffer);
СпиÑок ÑипÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð°ÑивÑв:
Uint8Array,Uint16Array,Uint32Arrayâ Ð´Ð»Ñ ÑÑÐ»Ð¸Ñ Ð±ÐµÐ·Ð·Ð½Ð°ÐºÐ¾Ð²Ð¸Ñ ÑиÑел з Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¾Ñ 8, 16 або 32 бÑÑ.Uint8ClampedArrayâ Ð´Ð»Ñ 8-бÑÑÐ¾Ð²Ð¸Ñ Ð±ÐµÐ·Ð·Ð½Ð°ÐºÐ¾Ð²Ð¸Ñ ÑÑÐ»Ð¸Ñ ÑиÑел, Ñо âобÑÑзаÑÑÑÑÑâ пÑи пÑиÑвоÑÐ½Ð½Ñ (поÑÑÐ½ÐµÐ½Ð½Ñ Ð½Ð¸Ð¶Ñе).
Int8Array,Int16Array,Int32Arrayâ Ð´Ð»Ñ ÑÑÐ»Ð¸Ñ ÑиÑел Ð·Ñ Ð·Ð½Ð°ÐºÐ¾Ð¼ (можÑÑÑ Ð¼Ð°Ñи вÑдâÑÐ¼Ð½Ñ Ð·Ð½Ð°ÑеннÑ).Float32Array,Float64Arrayâ Ð´Ð»Ñ ÑиÑел з плаваÑÑÐ¾Ñ ÐºÐ¾Ð¼Ð¾Ñ Ð·Ñ Ð·Ð½Ð°ÐºÐ¾Ð¼ Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¾Ñ 32 або 64 бÑÑи.
int8 або подÑбниÑ
ÑипÑв Ð´Ð»Ñ Ð·Ð½Ð°ÑенÑÐвеÑнÑÑÑ ÑвагÑ, попÑи Ñмена на кÑÑÐ°Ð»Ñ Int8Array, в JavaScript не ÑÑнÑÑ Ð·Ð½Ð°ÑÐµÐ½Ñ Ð· Ñипами int або int8.
Це логÑÑно, оÑкÑлÑки, Int8Array не Ñ Ð¼Ð°Ñивом окÑемиÑ
знаÑеннÑ, а вÑÑого-на-вÑÑого пÑедÑÑавленнÑм ArrayBuffer.
ÐÐ¸Ñ Ñд за облаÑÑÑ Ð´Ð¾Ð¿ÑÑÑÐ¸Ð¼Ð¸Ñ Ð·Ð½Ð°ÑенÑ
Що бÑде Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ ÑпÑоби запиÑаÑи знаÑеннÑ, Ñо не вмÑÑÑÑÑÑÑÑ Ð² облаÑÑÑ Ð´Ð¾Ð¿ÑÑÑÐ¸Ð¼Ð¸Ñ Ð·Ð½Ð°ÑенÑ? Це не пÑизведе до помилки, але Ð·Ð°Ð¹Ð²Ñ Ð±ÑÑи знаÑÐµÐ½Ð½Ñ Ð±Ñде вÑдкинÑÑо.
ÐапÑиклад, запиÑемо 256 в Uint8Array. РбÑнаÑÐ½Ð¾Ð¼Ñ ÑоÑмаÑÑ 256 Ñе 100000000 (9 бÑÑ), але Uint8Array дозволÑÑ ÑÑлÑки 8 бÑÑ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ знаÑеннÑ, ÑобÑо знаÑÐµÐ½Ð½Ñ Ð²Ñд 0 до 255.
ÐÐ»Ñ Ð±ÑлÑÑÐ¸Ñ ÑиÑел ÑÑлÑки пÑÐ°Ð²Ñ (Ð½Ð°Ð¹Ð¼ÐµÐ½Ñ Ð·Ð½Ð°ÑÑÑÑ) 8 бÑÑ Ð±Ñде збеÑежено, а ÑеÑÑÑ Ð±Ñде обÑÑзано.
Ð¢Ð¾Ð¼Ñ Ð¼Ð¸ оÑÑимаÑмо нÑлÑ.
257 в бÑнаÑÐ½Ð¾Ð¼Ñ ÑоÑмаÑÑ Ð±Ñде 100000001 (9 бÑÑ), пÑÐ°Ð²Ñ 8 бÑÑ Ð±Ñде збеÑежено, ÑÐ¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ð² маÑÐ¸Ð²Ñ Ð±Ñде 1:
ÐнакÑе кажÑÑи, бÑде збеÑежено ÑÑлÑки ÑиÑло за модÑлем 28.
ÐÑиклад:
let uint8array = new Uint8Array(16);
let num = 256;
alert(num.toString(2)); // 100000000 (бÑнаÑна ÑоÑма)
uint8array[0] = 256;
uint8array[1] = 257;
alert(uint8array[0]); // 0
alert(uint8array[1]); // 1
Uint8ClampedArray Ñ Ð¾Ñобливим в ÑÑÐ¾Ð¼Ñ ÑенÑÑ, його поведÑнка вÑдÑÑзнÑÑÑÑÑÑ. ÐÑде збеÑежено 255 Ð´Ð»Ñ ÑÑÑÑ
ÑиÑел, Ñо бÑлÑÑе нÑж 255 Ñа 0 Ð´Ð»Ñ Ð²ÑдâÑмниÑ
ÑиÑел. Така поведÑнка бÑде в Ð½Ð°Ð³Ð¾Ð´Ñ Ð¿Ñи обÑобÑÑ Ð·Ð¾Ð±ÑаженÑ.
ÐеÑоди TypedArray
ÐеÑоди TypedArray в ÑÑÐ»Ð¾Ð¼Ñ Ð·Ð±ÑгаÑÑÑÑÑ Ð· меÑодами звиÑайного Array, але Ñ Ð´ÐµÑÐºÑ Ð²ÑдмÑнноÑÑÑ.
Ðи можемо його пеÑебиÑаÑи з викоÑиÑÑаннÑм map, slice, find, reduce ÑоÑо.
Ðле Ñ ÑеÑÑ, Ñо ми не можемо зÑобиÑи:
- ÐÐµÐ¼Ð°Ñ Ð¼ÐµÑодÑ
spliceâ ми не можемо âвидалиÑиâ знаÑеннÑ. РоÑÐ½Ð¾Ð²Ñ ÑипÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð°ÑивÑв лежиÑÑ Ð±ÑÑеÑ, Ñо Ñ Ð½ÐµÐ¿ÐµÑеÑÐ²Ð½Ð¾Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿Ð°Ð¼âÑÑÑ ÑÑкÑÐ¾Ð²Ð°Ð½Ð¾Ñ Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¸, а ÑипÑÐ·Ð¾Ð²Ð°Ð½Ñ Ð¼Ð°Ñиви Ñ Ð²ÑÑого-на-вÑÑого ÑÑ Ð¿ÑедÑÑавленнÑм. Ðи можемо ÑÑлÑки пÑиÑвоÑÑи нÑлÑове знаÑеннÑ. - ÐÐµÐ¼Ð°Ñ Ð¼ÐµÑодÑ
concat.
ÐÑнÑÑ 2 додаÑÐºÐ¾Ð²Ð¸Ñ Ð¼ÐµÑоди:
arr.set(fromArr, [offset])копÑÑÑ Ð²ÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñи, Ñо поÑинаÑÑÑÑÑ Ð·offset(Ñипово з 0) зfromArrвarr.arr.subarray([begin, end])ÑÑвоÑÑÑ Ð½Ð¾Ð²Ðµ пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ Ñакого ж ÑÐ¸Ð¿Ñ Ð¿Ð¾ÑинаÑÑи зbeginдоend(не вклÑÑно). Це ÑÑ Ð¾Ð¶Ðµ на меÑодslice(Ñо Ñакож пÑдÑÑимÑÑÑÑÑÑ), але знаÑÐµÐ½Ð½Ñ Ð½Ðµ бÑде ÑкопÑйовано â ÑÑлÑки ÑÑвоÑÑÑÑÑÑÑ Ð½Ð¾Ð²Ðµ пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ ÑобоÑи з Ñими Ñамими даними.
Ð¦Ñ Ð¼ÐµÑоди даÑÑÑ Ð·Ð¼Ð¾Ð³Ñ ÐºÐ¾Ð¿ÑÑваÑи ÑипÑÐ·Ð¾Ð²Ð°Ð½Ñ Ð¼Ð°Ñиви, змÑÑÑваÑи ÑÑ , ÑÑвоÑÑваÑи Ð½Ð¾Ð²Ñ ÒÑÑнÑÑÑÑиÑÑ Ð½Ð° попеÑеднÑÑ Ñ Ñак далÑ.
DataView
DataView ÑпеÑÑалÑне надзвиÑайно гнÑÑке âне ÑипÑзованеâ пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ ArrayBuffer. Це дозволÑÑ Ð¾ÑÑимаÑи доÑÑÑп до даниÑ
з бÑдÑ-Ñким змÑÑеннÑм Ñа в бÑдÑ-ÑÐºÐ¾Ð¼Ñ ÑоÑмаÑÑ.
- ÐÐ»Ñ ÑипÑзованого маÑÐ¸Ð²Ñ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¾Ñ Ð²Ð¸Ð·Ð½Ð°ÑÐ°Ñ ÑоÑÐ¼Ð°Ñ Ð´Ð°Ð½Ð¸Ñ
. УвеÑÑ Ð¼Ð°Ñив повинен ÑкладаÑиÑÑ Ð·Ñ Ð·Ð½Ð°ÑÐµÐ½Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑипÑ. ÐоÑÑÑп до i-го елеменÑÑ Ð²Ð¸ÐºÐ¾Ð½ÑÑÑÑÑÑ Ð·Ð° допомогоÑ
arr[i]. - Ð
DataViewдоÑÑÑп до Ð´Ð°Ð½Ð¸Ñ Ð²ÑдбÑваÑÑÑÑÑ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ð¼ÐµÑодÑв на кÑÑалÑ.getUint8(i)Ñи.getUint16(i). Ð¢ÐµÐ¿ÐµÑ Ð¼Ð¾Ð¶Ð½Ð° обиÑаÑи ÑоÑÐ¼Ð°Ñ Ð´Ð°Ð½Ð¸Ñ Ð¿Ñд ÑÐ°Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ Ð¼ÐµÑодÑ, а не конÑÑÑÑкÑоÑа.
СинÑакÑиÑ:
new DataView(buffer, [byteOffset], [byteLength])
bufferâ базовийArrayBuffer. Ðа вÑдмÑÐ½Ñ Ð²Ñд ÑипÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð°ÑивÑвDataViewне ÑÑвоÑÑÑ Ð½Ð¾Ð²Ð¸Ð¹ бÑÑеÑ. Ðого поÑÑÑбно ÑÑвоÑиÑи завÑаÑно.byteOffsetâ поÑаÑкова позиÑÑÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ (Ñипове знаÑÐµÐ½Ð½Ñ 0).byteLengthâ довжина пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ Ð² байÑÐ°Ñ (Ñипове знаÑÐµÐ½Ð½Ñ Ð´Ð¾ÑÑвнÑÑ ÐºÑнÑÑbuffer).
ÐапÑиклад, ÑÑÑ Ð¼Ð¸ дÑÑÑаÑмо ÑиÑла в ÑÑÐ·Ð½Ð¾Ð¼Ñ ÑоÑмаÑÑ Ð· одного й Ñого ж Ñамого бÑÑеÑÑ:
// бÑнаÑний маÑив Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¾Ñ 4 байÑи, вÑÑ ÑиÑла маÑÑÑ Ð¼Ð°ÐºÑималÑне знаÑÐµÐ½Ð½Ñ 255
let buffer = new Uint8Array([255, 255, 255, 255]).buffer;
let dataView = new DataView(buffer);
// оÑÑимаÑи 8-бÑÑове ÑиÑло за змÑÑеннÑм 0
alert( dataView.getUint8(0) ); // 255
// ÑÐµÐ¿ÐµÑ Ð¾ÑÑимаÑи 16-бÑÑове ÑиÑло за змÑÑеннÑм 0, воно ÑкладаÑÑÑÑÑ Ð· 2 байÑ, Ñо Ñазом пÑедÑÑавлÑÑÑÑÑÑ Ñк 65535
alert( dataView.getUint16(0) ); // 65535 (найбÑлÑÑе 16-бÑÑове беззнакове ÑÑле ÑиÑло)
// оÑÑимаÑи 32-бÑÑове ÑиÑло за змÑÑеннÑм 0
alert( dataView.getUint32(0) ); // 4294967295 (найбÑлÑÑе 32-бÑÑове беззнакове ÑÑле ÑиÑло)
dataView.setUint32(0, 0); // вÑÑановиÑи 4-байÑове ÑиÑло в нÑлÑ, ÑобÑо запиÑаÑи вÑÑ Ð±Ð°Ð¹Ñи Ñк 0
DataView зÑÑÑне Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑаннÑ, коли ми збеÑÑгаÑмо Ð´Ð°Ð½Ñ ÑÑзного ÑоÑмаÑÑ Ð² Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð±ÑÑеÑÑ. ÐапÑиклад, коли ми збеÑÑгаÑмо поÑлÑдовнÑÑÑÑ Ð¿Ð°Ñ (16-бÑÑове ÑÑле ÑиÑло, 32-бÑÑове ÑиÑло з плаваÑÑÐ¾Ñ ÐºÐ¾Ð¼Ð¾Ñ), DataView дозволÑÑ Ð»ÐµÐ³ÐºÐ¾ оÑÑимаÑи до ниÑ
доÑÑÑп.
ÐÑдÑÑмки
ArrayBuffer â головний обâÑкÑ, Ñо Ñ Ð¿Ð¾ÑиланнÑм на непеÑеÑÐ²Ð½Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿Ð°Ð¼âÑÑÑ ÑÑкÑÐ¾Ð²Ð°Ð½Ð¾Ñ Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¸.
ÐÐ»Ñ Ð±ÑлÑÑоÑÑÑ Ð¾Ð¿ÐµÑаÑÑй з ArrayBuffer нам поÑÑÑбне пÑедÑÑавленнÑ.
- Це може бÑÑи
TypedArray:Uint8Array,Uint16Array,Uint32Arrayâ Ð´Ð»Ñ Ð±ÐµÐ·Ð·Ð½Ð°ÐºÐ¾Ð²Ð¸Ñ ÑÑÐ»Ð¸Ñ ÑиÑел Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¾Ñ 8, 16 Ñа 32 бÑÑи.Uint8ClampedArrayâ Ð´Ð»Ñ 8-бÑÑÐ¾Ð²Ð¸Ñ ÑÑÐ»Ð¸Ñ ÑиÑел, пÑи пÑиÑвоÑÐ½Ð½Ñ Ð²ÑдбÑваÑÑÑÑÑ âобÑÑзаннÑâ знаÑенÑ.Int8Array,Int16Array,Int32Arrayâ Ð´Ð»Ñ ÑÑÐ»Ð¸Ñ ÑиÑел Ð·Ñ Ð·Ð½Ð°ÐºÐ¾Ð¼ (можÑÑÑ Ð±ÑÑи вÑдâÑмними).Float32Array,Float64Arrayâ Ð´Ð»Ñ ÑиÑел з плаваÑÑÐ¾Ñ ÐºÐ¾Ð¼Ð¾Ñ Ð·Ñ Ð·Ð½Ð°ÐºÐ¾Ð¼ Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¾Ñ 32 Ñа 64 бÑÑи.
- Чи
DataViewâ пÑедÑÑавленнÑ, Ñке дозволÑÑ Ð²Ð¸Ð±ÑаÑи ÑоÑÐ¼Ð°Ñ Ð´Ð°Ð½Ð¸Ñ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ð¼ÐµÑодÑв ÑкgetUint8(offset).
У бÑлÑÑоÑÑÑ Ð²Ð¸Ð¿Ð°Ð´ÐºÑв ми маÑмо ÑпÑÐ°Ð²Ñ Ð±ÐµÐ·Ð¿Ð¾ÑеÑеднÑо з ÑипÑзованими маÑивами, а ArrayBuffer залиÑаÑÑÑÑÑ Ð¿ÑиÑ
ованим. ЯкÑо необÑ
Ñдно, можливо оÑÑимаÑи доÑÑÑп до бÑÑеÑÑ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ .buffer Ñа ÑÑвоÑиÑи нове пÑедÑÑавленнÑ.
Також Ð´Ð»Ñ Ð¾Ð¿Ð¸ÑÑ Ð¼ÐµÑодÑв, Ñо дозволÑÑÑÑ Ð¿ÑаÑÑваÑи з бÑнаÑними даними ÑÑнÑÑ Ð´Ð²Ð° додаÑÐºÐ¾Ð²Ð¸Ñ ÑеÑмÑни:
ArrayBufferViewâ загалÑна назва пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð²ÑÑÑ ÑипÑв.BufferSourceâ ÑеÑмÑн, Ñо ознаÑаÑArrayBufferабоArrayBufferView.
Ð¦Ñ ÑеÑмÑни Ñакож бÑдÑÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑÐ°Ð½Ñ Ð² наÑÑÑпнÑй ÑаÑÑинÑ. BufferSource ÑаÑÑо викоÑиÑÑовÑÑÑÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ âбÑдÑ-ÑкиÑ
бÑнаÑниÑ
даниÑ
â â ArrayBuffer Ñи його пÑедÑÑавленнÑ.
ÐÑÑ Ð¿Ñдказка:
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)