ТипизиÑованнÑе маÑÑÐ¸Ð²Ñ Ð² JavaScript ÑвлÑÑÑÑÑ Ð¼Ð°ÑÑивоподобнÑми обÑекÑами, пÑедоÑÑавлÑÑÑими меÑ
анизм доÑÑÑпа к ÑÑÑÑм двоиÑнÑм даннÑм. Ðак Ð²Ñ Ñже можеÑе знаÑÑ, маÑÑив Array
ÑаÑÑÑÑ Ð¸ обÑезаеÑÑÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки, и Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ ÑлеменÑÑ Ð»Ñбого Ñипа JavaScript. ÐлагодаÑÑ Ð¾Ð¿ÑимизаÑиÑм JavaScript движков, маÑÑÐ¸Ð²Ñ Ð¾ÑÑаÑÑÑÑ Ð±ÑÑÑÑÑми. Ðднако, Ñо вÑеменем, веб-пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑÑановÑÑÑÑ Ð²Ñе более и более моÑнÑми, поÑвлÑеÑÑÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑÑ ÑабоÑÑ Ñ Ð°Ñдио- и видео-даннÑми, ÑÑебÑеÑÑÑ Ð´Ð¾ÑÑÑп к ÑÑÑÑм даннÑм WebSocket, и Ñак далее. СÑановиÑÑÑ Ð¾ÑевиднÑм, ÑÑо возможноÑÑÑ Ð±ÑÑÑÑой и ÑÑÑекÑивной ÑабоÑÑ Ñ Ð´Ð²Ð¾Ð¸ÑнÑми даннÑми в JavaScript бÑÐ´ÐµÑ Ð¾ÑÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾Ð¹, Ð´Ð»Ñ Ñего ÑипизиÑованнÑе маÑÑÐ¸Ð²Ñ Ð¸ пÑедназнаÑенÑ.
Ðе ÑледÑÐµÑ Ð¿ÑÑаÑÑ ÑипизиÑованнÑе маÑÑÐ¸Ð²Ñ Ñ Ð¾Ð±ÑÑнÑми маÑÑивами: Ñак, напÑимеÑ, вÑзов Array.isArray()
Ð´Ð»Ñ ÑипизиÑованного маÑÑива веÑнÑÑ false
. Ðолее Ñого, не вÑе меÑодÑ, доÑÑÑпнÑе Ð´Ð»Ñ Ð¾Ð±ÑÑнÑÑ
маÑÑивов поддеÑживаÑÑÑÑ ÑипизиÑованнÑми маÑÑивами (напÑимеÑ, push и pop).
ÐÐ»Ñ Ð´Ð¾ÑÑÐ¸Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑималÑной гибкоÑÑи и пÑоизводиÑелÑноÑÑи, ÑеализаÑÐ¸Ñ ÑипизиÑованнÑÑ
маÑÑивов в JavaScript Ñазделена на бÑÑеÑÑ Ð¸ пÑедÑÑавлениÑ. ÐÑÑÐµÑ (ArrayBuffer
) ââ ÑÑо обÑекÑ, пÑедÑÑавлÑÑÑий из ÑÐµÐ±Ñ Ð½Ð°Ð±Ð¾Ñ Ð´Ð°Ð½Ð½ÑÑ
. Ðн не Ð¸Ð¼ÐµÐµÑ ÑоÑмаÑа и не пÑедоÑÑавлÑÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи доÑÑÑпа к ÑÐ²Ð¾ÐµÐ¼Ñ ÑодеÑжимомÑ. ÐÐ»Ñ Ð´Ð¾ÑÑÑпа к памÑÑи бÑÑеÑа вам нÑжно иÑполÑзоваÑÑ Ð¿ÑедÑÑавление. ÐÑедÑÑавление пÑедоÑÑавлÑÐµÑ ÐºÐ¾Ð½ÑекÑÑ: Ñип даннÑÑ
, наÑалÑнÑÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ð² бÑÑеÑе и колиÑеÑÑво ÑлеменÑов. ÐÑо позволÑÐµÑ Ð¿ÑедÑÑавиÑÑ Ð´Ð°Ð½Ð½Ñе в виде ÑипизиÑованного маÑÑива.
ÐбÑÐµÐºÑ ArrayBuffer
ââ ÑÑо Ð½Ð°Ð±Ð¾Ñ Ð±Ð¸Ð½Ð°ÑнÑÑ
даннÑÑ
Ñ ÑикÑиÑованной длиной. ÐÑ Ð½Ðµ можеÑе манипÑлиÑоваÑÑ ÑодеÑжимÑм ArrayBuffer
напÑÑмÑÑ. ÐмеÑÑо ÑÑого, необÑ
одимо ÑоздаÑÑ ÑипизиÑованное пÑедÑÑавление DataView
, коÑоÑое бÑÐ´ÐµÑ Ð¾ÑобÑажаÑÑ Ð±ÑÑÐµÑ Ð² опÑеделÑнном ÑоÑмаÑе, и даÑÑ Ð´Ð¾ÑÑÑп на запиÑÑ Ð¸ ÑÑение его ÑодеÑжимого.
Ðазвание ÑипизиÑованного пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð°ÑÑива говоÑÐ¸Ñ Ñамо за ÑебÑ. Ðно пÑедÑÑавлÑÐµÑ Ð¼Ð°ÑÑив в ÑаÑпÑоÑÑÑанÑннÑÑ
ÑиÑловÑÑ
ÑоÑмаÑаÑ
, ÑакиÑ
как Int8
, Uint32
, Float64
и Ñак далее. СÑеди пÑоÑиÑ
, ÑÑÑеÑÑвÑÐµÑ ÑпеÑиалÑное пÑедÑÑавление Uint8ClampedArray
. Ðно огÑаниÑÐ¸Ð²Ð°ÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¸Ð½ÑеÑвалом Ð¾Ñ 0 до 255. ÐÑо полезно, напÑимеÑ, пÑи ÐбÑабоÑке даннÑÑ
изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² Canvas.
ÐбÑÐµÐºÑ DataView
ââ ÑÑо низкоÑÑовневÑй инÑеÑÑейÑ, пÑедоÑÑавлÑÑÑий API Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи/ÑÑÐµÐ½Ð¸Ñ Ð¿ÑоизволÑнÑÑ
даннÑÑ
в бÑÑеÑ. ÐÑо полезно пÑи ÑабоÑе Ñ ÑазлиÑнÑми Ñипами даннÑÑ
, напÑимеÑ. Ð Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº ÑипизиÑованнÑе пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ñегда имеÑÑ Ð¿Ð¾ÑÑдок Ð±Ð°Ð¹Ñ (ÑмоÑÑиÑе Endianness) ÑооÑвеÑÑÑвÑÑÑий иÑполÑзÑÐµÐ¼Ð¾Ð¼Ñ Ð² ваÑей опеÑаÑионной ÑиÑÑеме, DataView
позволÑÐµÑ ÐºÐ¾Ð½ÑÑоллиÑоваÑÑ Ð¿Ð¾ÑÑдок Ð±Ð°Ð¹Ñ (byte-order). Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑÑо big-endian, но ÑеÑез API можно ÑÑÑановиÑÑ little-endian.
FileReader.prototype.readAsArrayBuffer()
ÐеÑод FileReader.prototype.readAsArrayBuffer()
ÑиÑÐ°ÐµÑ ÑодеÑжимое заданного Blob
или File
.
XMLHttpRequest.prototype.send()
ÐеÑод send()
ÑкземплÑÑа XMLHttpRequest
ÑепеÑÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð² каÑеÑÑве аÑгÑменÑа ArrayBuffer
.
ImageData.data
ÐÐ¼ÐµÐµÑ Ñип Uint8ClampedArray
и пÑедÑÑавлÑÐµÑ Ð¸Ð·Ð¾Ð±Ñажение в виде одномеÑного маÑÑива, где ÑвеÑовÑе компоненÑÑ ÑаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ñ Ð² поÑÑдке RGBA, и иÑ
знаÑÐµÐ½Ð¸Ñ Ð¿ÑинÑдиÑелÑно огÑаниÑÐµÐ½Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð¾Ð¼ Ð¾Ñ 0 до 255.
ÐÑежде вÑего, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑоздаÑÑ Ð±ÑÑÐµÑ Ñ ÑикÑиÑованной длиной 16 байÑ:
var buffer = new ArrayBuffer(16);
Ðа данном ÑÑапе Ð¼Ñ Ð¸Ð¼ÐµÐµÐ¼ облаÑÑÑ Ð¿Ð°Ð¼ÑÑи в 16 байÑ, иниÑиализиÑованной нÑлевÑми знаÑениÑми. ÐÑÑ, ÑÑо Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑделаÑÑ ÑейÑаÑ, ÑÑо ÑбедиÑÑÑÑ, ÑÑо длина бÑÑеÑа дейÑÑвиÑелÑно 16 байÑ:
if (buffer.byteLength === 16) {
console.log("Ðа, ÑÑо 16 байÑ.");
} else {
console.log("РнеÑ, ÑÐ°Ð·Ð¼ÐµÑ Ð½Ðµ наÑ!");
}
ÐÑежде Ñем Ð¼Ñ Ñможем пÑиÑÑÑпиÑÑ Ðº полноÑенной ÑабоÑе Ñ Ð¿Ð°Ð¼ÑÑÑÑ, нам нÑжно ÑоздаÑÑ Ð¿ÑедÑÑавление. ÐавайÑе Ñоздадим пÑедÑÑавление, коÑоÑое оÑобÑÐ°Ð¶Ð°ÐµÑ Ð±ÑÑÐµÑ ÐºÐ°Ðº маÑÑив из 32-биÑнÑÑ ÑелоÑиÑленнÑÑ Ð·Ð½Ð°Ñений Ñо знаком:
var int32View = new Int32Array(buffer);
ТепеÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ полÑÑиÑÑ Ð´Ð¾ÑÑÑп к ÑлеменÑам пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ°Ðº к ÑлеменÑам обÑÑного маÑÑива:
for (var i = 0; i < int32View.length; i++) {
int32View[i] = i * 2;
}
ÐÑÐ¾Ñ ÐºÐ¾Ð´ помеÑÑÐ¸Ñ 4 ÑлеменÑа в бÑÑÐµÑ (4 ÑлеменÑа по 4 байÑа даÑÑ 16 байÑ) Ñо ÑледÑÑÑими знаÑениÑм: 0
, 2
, 4
и 6
.
ÐÑÑ ÑÑановиÑÑÑ Ð½Ð°Ð¼Ð½Ð¾Ð³Ð¾ инÑеÑеÑнее, еÑли ÑоздаÑÑ Ð½ÐµÑколÑко ÑазнÑÑ Ð¿ÑедÑÑавлений Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ и Ñого же бÑÑеÑа. ÐапÑимеÑ, пÑиведÑннÑй вÑÑе код можно дополниÑÑ ÑледÑÑÑим обÑазом:
var int16View = new Int16Array(buffer);
for (var i = 0; i < int16View.length; i++) {
console.log("Entry " + i + ": " + int16View[i]);
}
ÐдеÑÑ Ð¼Ñ ÑоздаÑм 16-биÑное ÑелоÑиÑленное пÑедÑÑавление, коÑоÑое ÑÑÑлаеÑÑÑ Ð½Ð° ÑÐ¾Ñ Ð¶Ðµ ÑамÑй бÑÑеÑ, ÑÑо и 32-биÑное пÑедÑÑавление, и заÑем вÑводим вÑе 16-биÑнÑе ÑлеменÑÑ ÑÑого пÑедÑÑавлениÑ. ÐÑ Ð¿Ð¾Ð»ÑÑим ÑледÑÑÑий вÑвод: 0, 0, 2, 0, 4, 0, 6, 0.
Ðожно пойÑи далÑÑе. ÐÑениÑе ÑÑÐ¾Ñ ÐºÐ¾Ð´:
int16View[0] = 32;
console.log("ÐÐ»ÐµÐ¼ÐµÐ½Ñ 0 в 32-биÑном пÑедÑÑавлении ÑепеÑÑ Ñавен " + int32View[0]);
РезÑлÑÑаÑом вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑÐ°Ð½ÐµÑ ÑекÑÑ: "ÐÐ»ÐµÐ¼ÐµÐ½Ñ 0 в 32-биÑном пÑедÑÑавлении ÑепеÑÑ Ñавен 32". ÐÑÑгими Ñловами, два маÑÑива на Ñамом деле ÑвлÑÑÑÑÑ Ð»Ð¸ÑÑ ÑазнÑми пÑедÑÑавлениÑми одного и Ñого же бÑÑеÑа даннÑÑ Ð² ÑазнÑÑ ÑоÑмаÑÐ°Ñ . ÐÑ Ð¼Ð¾Ð¶ÐµÑе повÑоÑиÑÑ ÑÑо Ñ Ð¿ÑедÑÑавлениÑми лÑбого Ñипа.
РабоÑа Ñо ÑложнÑми ÑÑÑÑкÑÑÑами даннÑÑÐомбиниÑÑÑ Ð±ÑÑÐµÑ Ð¸ множеÑÑво пÑедÑÑавлений Ñазного ÑоÑмаÑа, имеÑÑÐ¸Ñ ÑазнÑе ÑмеÑÐµÐ½Ð¸Ñ Ð¾ÑноÑиÑелÑно наÑала бÑÑеÑа, можно ÑпÑавлÑÑÑÑÑ Ñ Ð¾Ð±ÑекÑами ÑодеÑжаÑими ÑазноÑоднÑе даннÑе. ÐÑо позволÑеÑ, к пÑимеÑÑ, взаимодейÑÑвоваÑÑ Ñо ÑложнÑми ÑÑÑÑкÑÑÑам из WebGL, Ñайлами даннÑÑ Ð¸Ð»Ð¸ ÑÑÑÑкÑÑÑами ÑзÑка C (ÑопоÑÑавление даннÑÑ JS и C).
РаÑÑмоÑÑим ÑледÑÑÑÑÑ ÑÑÑÑкÑÑÑÑ Ð¸Ð· ÑзÑка C:
struct someStruct {
unsigned long id;
char username[16];
float amountDue;
};
ÐолÑÑиÑÑ Ð´Ð¾ÑÑÑп к полÑм ÑÑой ÑÑÑÑкÑÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑледÑÑÑим обÑазом:
var buffer = new ArrayBuffer(24);
// ... помеÑÑиÑÑ Ð´Ð°Ð½Ð½Ñе ÑÑÑÑкÑÑÑÑ Ð² бÑÑÐµÑ ...
var idView = new Uint32Array(buffer, 0, 1);
var usernameView = new Uint8Array(buffer, 4, 16);
var amountDueView = new Float32Array(buffer, 20, 1);
ТепеÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¸Ð»Ð¸ измениÑÑ Ð·Ð½Ð°Ñение Ð¿Ð¾Ð»Ñ amountDue
, к пÑимеÑÑ, можно пÑÑÑм обÑаÑÐµÐ½Ð¸Ñ Ðº amountDueView[0]
.
ÐÑимеÑание: ÐÑÑавнивание даннÑÑ Ð² ÑзÑке C ÑвлÑеÑÑÑ Ð¿Ð»Ð°ÑÑоÑмозавиÑимÑм. ÐÑинимайÑе меÑÑ Ð¿Ð¾ вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¿ÑавилÑнÑÑ Ð¾ÑÑÑÑпов в даннÑÑ Ñ ÑÑÑÑом вÑÑавниваниÑ.
ÐÑеобÑазование в обÑÑнÑе маÑÑивÑÐногда поÑле обÑабоÑки ÑипизиÑованного маÑÑива бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ конвеÑÑиÑоваÑÑ ÐµÐ³Ð¾ в обÑÑнÑй маÑÑив, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð¾ÑÑÑп к меÑодам пÑоÑоÑипа Array
. ÐÐ»Ñ ÑÑиÑ
Ñелей ÑÑÑеÑÑвÑÐµÑ Ð¼ÐµÑод Array.from
. Рв ÑеÑ
ÑлÑÑаÑÑ
, когда Array.from
не поддеÑживаеÑÑÑ, иÑполÑзÑйÑе ÑледÑÑÑий код:
var typedArray = new Uint8Array([1, 2, 3, 4]),
normalArray = Array.prototype.slice.call(typedArray);
normalArray.length === 4;
normalArray.constructor === Array;
СмоÑÑиÑе Ñакже
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4