Ð ÑÑеÑе веб-ÑазÑабоÑки Ð¼Ñ Ð²ÑÑÑеÑаемÑÑ Ñ Ð±Ð¸Ð½Ð°ÑнÑми даннÑми ÑаÑе вÑего Ñогда, когда ÑÑебÑеÑÑÑ Ð²ÑполниÑÑ ÐºÐ°ÐºÐ¸Ðµ-Ñо дейÑÑÐ²Ð¸Ñ Ð½Ð°Ð´ Ñайлами (ÑоздаÑÑ, загÑÑзиÑÑ Ð¸Ð»Ð¸ ÑкаÑаÑÑ). ÐÑÑгим ÑипиÑнÑм пÑимеÑом Ñакой вÑÑÑеÑи ÑвлÑеÑÑÑ Ð¾Ð±ÑабоÑка изобÑажений.
ÐÑÑ ÑÑо возможно оÑÑÑеÑÑвиÑÑ Ð½Ð° JavaScript. Ðолее Ñого, опеÑаÑии над бинаÑнÑми даннÑми ÑвлÑÑÑÑÑ Ð²ÑÑокопÑоизводиÑелÑнÑми.
Ðбилие клаÑÑов Ð´Ð»Ñ ÑабоÑÑ Ñ Ð±Ð¸Ð½Ð°ÑнÑми даннÑми Ð¼Ð¾Ð¶ÐµÑ Ð½ÐµÐ¼Ð½Ð¾Ð³Ð¾ запÑÑаÑÑ. ÐÐ¾Ñ Ð½ÐµÐºÐ¾ÑоÑÑе из Ð½Ð¸Ñ :
ArrayBuffer,Uint8Array,DataView,Blob,Fileи Ñ.д.
РабоÑа Ñ Ð±Ð¸Ð½Ð°ÑнÑми даннÑми в JavaScript Ñеализована неÑÑандаÑÑно по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð´ÑÑгими ÑзÑками пÑогÑаммиÑованиÑ. Ðо когда Ð¼Ñ Ð² ÑÑом ÑазбеÑÑмÑÑ, Ñо вÑÑ Ð¾ÐºÐ°Ð¶ÐµÑÑÑ Ð²ÐµÑÑма пÑоÑÑо.
ÐазовÑй обÑÐµÐºÑ Ð´Ð»Ñ ÑабоÑÑ Ñ Ð±Ð¸Ð½Ð°ÑнÑми даннÑми Ð¸Ð¼ÐµÐµÑ Ñип ArrayBuffer и пÑедÑÑавлÑÐµÑ Ñобой ÑÑÑÐ»ÐºÑ Ð½Ð° непÑеÑÑвнÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿Ð°Ð¼ÑÑи ÑикÑиÑованной длинÑ.
ÐÐ¾Ñ Ñак Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑоздаÑÑ ÐµÐ³Ð¾ ÑкземплÑÑ:
let buffer = new ArrayBuffer(16); // ÑоздаÑÑÑÑ Ð±ÑÑÐµÑ Ð´Ð»Ð¸Ð½Ð¾Ð¹ 16 байÑ
alert(buffer.byteLength); // 16
ÐнÑÑÑÑкÑÐ¸Ñ Ð²ÑÑе вÑделÑÐµÑ Ð½ÐµÐ¿ÑеÑÑвнÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿Ð°Ð¼ÑÑи ÑазмеÑом 16 Ð±Ð°Ð¹Ñ Ð¸ заполнÑÐµÑ ÐµÑ Ð½ÑлÑми.
ArrayBuffer â ÑÑо не маÑÑив!ÐавайÑе внеÑÑм ÑÑноÑÑÑ, ÑÑÐ¾Ð±Ñ Ð½Ðµ запÑÑаÑÑÑÑ. ArrayBuffer не Ð¸Ð¼ÐµÐµÑ Ð½Ð¸Ñего обÑего Ñ Array:
- его длина ÑикÑиÑована, Ð¼Ñ Ð½Ðµ можем ÑвелиÑиваÑÑ Ð¸Ð»Ð¸ ÑменÑÑаÑÑ ÐµÑ.
ArrayBufferÐ·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ Ñовно ÑÑолÑко меÑÑа в памÑÑи, ÑколÑко ÑказÑваеÑÑÑ Ð¿Ñи Ñоздании.- ÐÐ»Ñ Ð´Ð¾ÑÑÑпа к оÑделÑнÑм байÑам нÑжен вÑпомогаÑелÑнÑй обÑекÑ-пÑедÑÑавление,
buffer[index]не ÑÑабоÑаеÑ.
ArrayBuffer â ÑÑо облаÑÑÑ Ð¿Ð°Ð¼ÑÑи. ЧÑо Ñам Ñ
ÑаниÑÑÑ? ÐÑой инÑоÑмаÑии неÑ. ÐÑоÑÑо необÑабоÑаннÑй («ÑÑÑой») маÑÑив байÑов.
ÐÐ»Ñ ÑабоÑÑ Ñ ArrayBuffer нам нÑжен ÑпеÑиалÑнÑй обÑекÑ, ÑеализÑÑÑий «пÑедÑÑавление» даннÑÑ
.
Такие обÑекÑÑ Ð½Ðµ Ñ
ÑанÑÑ ÐºÐ°ÐºÐ¾Ðµ-Ñо ÑобÑÑвенное ÑодеÑжимое. Ðни инÑеÑпÑеÑиÑÑÑÑ Ð±Ð¸Ð½Ð°ÑнÑе даннÑе, Ñ
ÑанÑÑиеÑÑ Ð² ArrayBuffer.
ÐапÑимеÑ:
Uint8Arrayâ пÑедÑÑавлÑÐµÑ ÐºÐ°Ð¶Ð´Ñй Ð±Ð°Ð¹Ñ Ð²ArrayBufferкак оÑделÑное ÑиÑло; возможнÑе знаÑÐµÐ½Ð¸Ñ Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ð² пÑомежÑÑке Ð¾Ñ 0 до 255 (в байÑе 8 биÑ, оÑÑÑда Ñакой набоÑ). Такое знаÑение назÑваеÑÑÑ Â«8-биÑное Ñелое без знака».Uint16Arrayâ пÑедÑÑавлÑÐµÑ ÐºÐ°Ð¶Ð´Ñе 2 байÑа вArrayBufferкак Ñелое ÑиÑло; возможнÑе знаÑÐµÐ½Ð¸Ñ Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ð² пÑомежÑÑке Ð¾Ñ 0 до 65535. Такое знаÑение назÑваеÑÑÑ Â«16-биÑное Ñелое без знака».Uint32Arrayâ пÑедÑÑавлÑÐµÑ ÐºÐ°Ð¶Ð´Ñе 4 байÑа вArrayBufferкак Ñелое ÑиÑло; возможнÑе знаÑÐµÐ½Ð¸Ñ Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ð² пÑомежÑÑке Ð¾Ñ 0 до 4294967295. Такое знаÑение назÑваеÑÑÑ Â«32-биÑное Ñелое без знака».Float64Arrayâ пÑедÑÑавлÑÐµÑ ÐºÐ°Ð¶Ð´Ñе 8 Ð±Ð°Ð¹Ñ Ð²ArrayBufferкак ÑиÑло Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой; возможнÑе знаÑÐµÐ½Ð¸Ñ Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ð² пÑомежÑÑке междÑ5.0x10-324и1.8x10308.
Таким обÑазом, бинаÑнÑе даннÑе из ArrayBuffer ÑазмеÑом 16 Ð±Ð°Ð¹Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ ÐºÐ°Ðº 16 ÑиÑел маленÑкой ÑазÑÑдноÑÑи или как 8 ÑиÑел болÑÑей ÑазÑÑдноÑÑи (по 2 байÑа каждое), или как 4 ÑиÑла еÑÑ Ð±Ð¾Ð»ÑÑей ÑазÑÑдноÑÑи (по 4 байÑа каждое), или как 2 ÑиÑла Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой вÑÑокой ÑоÑноÑÑи (по 8 Ð±Ð°Ð¹Ñ ÐºÐ°Ð¶Ð´Ð¾Ðµ).
ArrayBuffer â ÑÑо коÑневой обÑекÑ, оÑнова вÑего, необÑабоÑаннÑе бинаÑнÑе даннÑе.
Ðо еÑли Ð¼Ñ ÑобиÑаемÑÑ ÑÑо-Ñо запиÑаÑÑ Ð² него или пÑойÑиÑÑ Ð¿Ð¾ его ÑодеÑжимомÑ, да и вообÑе Ð´Ð»Ñ Ð»ÑбÑÑ Ð´ÐµÐ¹ÑÑвий Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸ÑполÑзоваÑÑ ÐºÐ°ÐºÐ¾Ð¹-Ñо обÑекÑ-пÑедÑÑавление («view»), напÑимеÑ:
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, ÑипизиÑованнÑй маÑÑив. У ниÑ
имееÑÑÑ Ð½Ð°Ð±Ð¾Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²ÑÑ
ÑвойÑÑв и меÑодов.
Ðни Ñже намного болÑÑе напоминаÑÑ Ð¾Ð±ÑÑнÑе маÑÑивÑ: ÑлеменÑÑ Ð¿ÑоиндекÑиÑованÑ, и возможно оÑÑÑеÑÑвиÑÑ Ð¾Ð±Ñ Ð¾Ð´ ÑодеÑжимого.
ÐонÑÑÑÑкÑоÑÑ ÑипизиÑованнÑÑ
маÑÑивов (бÑÐ´Ñ Ñо 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-Ð¼Ñ Ð±Ð°Ð¹Ñами Ñ ÑказаннÑми знаÑениÑми -
ÐÑли в конÑÑÑÑкÑÐ¾Ñ Ð¿ÐµÑедан дÑÑгой обÑÐµÐºÑ Ñипа
TypedArray, Ñо делаеÑÑÑ Ñо же Ñамое: ÑоздаÑÑÑÑ ÑипизиÑованнÑй маÑÑив Ñ Ñакой же длиной и в него копиÑÑеÑÑÑ ÑодеÑжимое. ÐÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи знаÑÐµÐ½Ð¸Ñ Ð±ÑдÑÑ Ð¿ÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ðº Ð½Ð¾Ð²Ð¾Ð¼Ñ ÑипÑ.let arr16 = new Uint16Array([1, 1000]); let arr8 = new Uint8Array(arr16); alert( arr8[0] ); // 1 alert( arr8[1] ); // 232, поÑÐ¾Ð¼Ñ ÑÑо 1000 не помеÑаеÑÑÑ Ð² 8 Ð±Ð¸Ñ (ÑазÑÑÑÐ½ÐµÐ½Ð¸Ñ Ð±ÑдÑÑ Ð½Ð¸Ð¶Ðµ) -
ÐÑли пеÑедано ÑиÑло
lengthâ бÑÐ´ÐµÑ Ñоздан ÑипизиÑованнÑй маÑÑив, ÑодеÑжаÑий именно ÑÑолÑко ÑлеменÑов. Ð Ð°Ð·Ð¼ÐµÑ Ð½Ð¾Ð²Ð¾Ð³Ð¾ маÑÑива в байÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ñавен ÑиÑÐ»Ñ ÑлеменÑовlength, ÑÐ¼Ð½Ð¾Ð¶ÐµÐ½Ð½Ð¾Ð¼Ñ Ð½Ð° ÑÐ°Ð·Ð¼ÐµÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑлеменÑаTypedArray.BYTES_PER_ELEMENT:let arr = new Uint16Array(4); // ÑоздаÑм ÑипизиÑованнÑй маÑÑив Ð´Ð»Ñ 4 ÑелÑÑ 16-биÑнÑÑ ÑиÑел без знака alert( Uint16Array.BYTES_PER_ELEMENT ); // 2 байÑа на ÑиÑло alert( arr.byteLength ); // 8 (ÑÐ°Ð·Ð¼ÐµÑ Ð¼Ð°ÑÑива в байÑÐ°Ñ ) -
ÐÑи вÑзове без аÑгÑменÑов бÑÐ´ÐµÑ Ñоздан пÑÑÑой ÑипизиÑованнÑй маÑÑив.
Ðак видим, можно ÑоздаваÑÑ ÑипизиÑованнÑе маÑÑÐ¸Ð²Ñ TypedArray напÑÑмÑÑ, не пеÑÐµÐ´Ð°Ð²Ð°Ñ Ð² конÑÑÑÑкÑÐ¾Ñ Ð¾Ð±ÑÐµÐºÑ Ñипа 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 младÑÐ¸Ñ Ð±Ð¸Ñов (ÑамÑе пÑавÑе) бÑдÑÑ Ð·Ð°Ð¿Ð¸ÑанÑ, а лиÑние оÑбÑоÑÑÑÑÑ:
Таким обÑазом, вмеÑÑо 256 запиÑеÑÑÑ 0.
ЧиÑло 257 в двоиÑном ÑоÑмаÑе вÑглÑÐ´Ð¸Ñ ÐºÐ°Ðº 100000001 (9 биÑ), но пÑинимаÑÑÑÑ Ð²Ð¾ внимание ÑолÑко 8 ÑамÑÑ
пÑавÑÑ
биÑов, Ñак ÑÑо в обÑÐµÐºÑ Ð±ÑÐ´ÐµÑ Ð·Ð°Ð¿Ð¸Ñана единиÑка:
ÐÑÑгими Ñловами, запиÑÑваÑÑÑÑ ÑолÑко знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ модÑÐ»Ñ 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â Ð¼Ñ Ð½Ðµ можем ÑдалÑÑÑ Ð·Ð½Ð°ÑениÑ, поÑÐ¾Ð¼Ñ ÑÑо ÑипизиÑованнÑе маÑÑÐ¸Ð²Ñ â ÑÑо вÑего лиÑÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸Ð· бÑÑеÑа, а бÑÑÐµÑ â ÑÑо непÑеÑÑÐ²Ð½Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿Ð°Ð¼ÑÑи ÑикÑиÑованной длинÑ. ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ ÑолÑко запиÑаÑÑ 0 вмеÑÑо знаÑениÑ. - ÐÐµÑ Ð¼ÐµÑода
concat.
Ðо заÑо еÑÑÑ Ð´Ð²Ð° дополниÑелÑнÑÑ Ð¼ÐµÑода:
arr.set(fromArr, [offset])копиÑÑÐµÑ Ð²Ñе ÑлеменÑÑ Ð¸Ð·fromArrвarr, наÑÐ¸Ð½Ð°Ñ Ñ Ð¿Ð¾Ð·Ð¸Ñииoffset(0 по ÑмолÑаниÑ).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, во вÑе его 4 байÑа бÑдÑÑ Ð·Ð°Ð¿Ð¸ÑÐ°Ð½Ñ Ð½Ñли
ÐÑедÑÑавление DataView оÑлиÑно подÑ
одиÑ, когда Ð¼Ñ Ñ
Ñаним даннÑе Ñазного ÑоÑмаÑа в одном бÑÑеÑе. ÐапÑимеÑ, Ð¼Ñ Ñ
Ñаним поÑледоваÑелÑноÑÑÑ Ð¿Ð°Ñ, пеÑвое знаÑение паÑÑ 16-биÑное Ñелое, а вÑоÑое â 32-биÑное Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой. DataView позволÑÐµÑ Ð»ÐµÐ³ÐºÐ¾ полÑÑиÑÑ Ð´Ð¾ÑÑÑп к обоим.
ÐÑого
ArrayBuffer â ÑÑо коÑневой обÑекÑ, ÑÑÑлка на непÑеÑÑвнÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿Ð°Ð¼ÑÑи ÑикÑиÑованной длинÑ.
ЧÑÐ¾Ð±Ñ ÑабоÑаÑÑ Ñ Ð¾Ð±ÑекÑами Ñипа ArrayBuffer, нам нÑжно пÑедÑÑавление («view»).
- ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑипизиÑованнÑй маÑÑив
TypedArray:Uint8Array,Uint16Array,Uint32Arrayâ Ð´Ð»Ñ Ð±ÐµÐ·Ð·Ð½Ð°ÐºÐ¾Ð²ÑÑ ÑелÑÑ Ð¿Ð¾ 8, 16 и 32 биÑа ÑооÑвеÑÑÑвенно.Uint8ClampedArrayâ Ð´Ð»Ñ 8-биÑнÑÑ Ð±ÐµÐ·Ð·Ð½Ð°ÐºÐ¾Ð²ÑÑ ÑелÑÑ , коÑоÑÑе обÑезаÑÑÑÑ Ð¿Ð¾ веÑÑ Ð½ÐµÐ¹ и нижней гÑаниÑе пÑи пÑиÑвоении.Int8Array,Int16Array,Int32Arrayâ Ð´Ð»Ñ Ð·Ð½Ð°ÐºÐ¾Ð²ÑÑ ÑелÑÑ ÑиÑел (могÑÑ Ð±ÑÑÑ Ð¾ÑÑиÑаÑелÑнÑми).Float32Array,Float64Arrayâ Ð´Ð»Ñ 32- и 64-биÑнÑÑ Ð·Ð½Ð°ÐºÐ¾Ð²ÑÑ ÑиÑел Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой.
- Ðли
DataViewâ пÑедÑÑавление, иÑполÑзÑÑÑее оÑделÑнÑе меÑодÑ, ÑÑÐ¾Ð±Ñ ÑÑоÑниÑÑ ÑоÑÐ¼Ð°Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¿Ñи обÑаÑении, напÑимеÑ,getUint8(offset).
ÐбÑÑно Ð¼Ñ ÑоздаÑм и ÑабоÑаем Ñ ÑипизиÑованнÑми маÑÑивами, оÑÑавлÑÑ ArrayBuffer «под капоÑом». Ðо Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ в лÑбой Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ðº Ð½ÐµÐ¼Ñ Ð´Ð¾ÑÑÑп Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ .buffer и пÑи необÑ
одимоÑÑи ÑоздаÑÑ Ð´ÑÑгое пÑедÑÑавление.
СÑÑеÑÑвÑÑÑ ÐµÑÑ 2 дополниÑелÑнÑÑ ÑеÑмина, коÑоÑÑе иÑполÑзÑÑÑÑÑ Ð² опиÑаниÑÑ Ð¼ÐµÑодов, ÑабоÑаÑÑÐ¸Ñ Ñ Ð±Ð¸Ð½Ð°ÑнÑми даннÑми:
ArrayBufferViewâ ÑÑо обÑее название Ð´Ð»Ñ Ð¿ÑедÑÑавлений вÑÐµÑ Ñипов.BufferSourceâ ÑÑо обÑее название длÑArrayBufferилиArrayBufferView.
ÐÑ Ð²ÑÑÑеÑимÑÑ Ñ Ð½Ð¸Ð¼Ð¸ в ÑледÑÑÑиÑ
главаÑ
. BufferSource вÑÑÑеÑаеÑÑÑ Ð¾ÑÐµÐ½Ñ ÑаÑÑо и ознаÑÐ°ÐµÑ Â«Ð±Ð¸Ð½Ð°ÑнÑе даннÑе в лÑбом виде» â ArrayBuffer или его пÑедÑÑавление.
ÐÐ¾Ñ ÑпаÑгалка:
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)