ArrayBufferオブジェクトとは何ですか?理解しやすいです

ArrayBuffer

ArrayBufferオブジェクトは、JavaScriptがバイナリデータを操作するためのインターフェイスです。個別の仕様(2011年2月にリリース)として、ES6はそれらをECMAScript仕様に組み込みました。配列の構文でバイナリデータを処理するため、バイナリ配列と呼ばれます。

バイナリ配列が生まれたのはこの背景に反しています。これにより、開発者は配列の添え字の形式でメモリを直接操作できるようになり、JavaScriptがバイナリデータを処理する機能が大幅に強化されます。

バイナリ配列は3種類のオブジェクトで構成されますArrayBufferTypedArrayつまりDataViewArrayBufferオブジェクトはプリミティブバイナリデータを表し、TypedArrayビューは単純なタイプのバイナリデータのDataView読み取りと書き込みに使用され、ビューは複雑なタイプのバイナリデータの読み取りと書き込みに使用されます。

ArrayBufferオブジェクト

ArrayBufferオブジェクトは、バイナリデータを格納するメモリの一部を表します。直接読み取りまたは書き込みはできませんが、ビュー(TypedArrayビューおよびDataViewビュー)を介してのみ読み取りおよび書き込みができます。ビューの機能は、指定された形式のバイナリデータを解釈することです。

ArrayBufferまた、データを格納できる連続したメモリ領域を割り当てるコンストラクタでもあります。32バイトのメモリ領域では、各バイトの値はデフォルトで0です。ご覧のとおりArrayBuffer、コンストラクターのパラメーターは必要なメモリー(バイト)です。

const buf = new ArrayBuffer(32);
复制代码

DataViewArrayBufferビューを作成するには、オブジェクトインスタンスをパラメータとして指定する必要があります。ビューを作成しDataView、符号なし8ビット整数形式で最初から8ビットバイナリデータを読み取りArrayBufferます。生のメモリのオブジェクトであるため、デフォルトではすべてのビットが0であるため、結果は0になります。

const buf = new ArrayBuffer(32);
const dataView = new DataView(buf);
dataView.getUint8(0)
复制代码

TypedArrayビューとDataViewは異なるビューは、異なるデータ形式を表します。これはコンストラクターではなく、コンストラクターのセットです。32ビットの符号付き整数(Int32Arrayコンストラクター)および8ビットの符号なし整数(Uint8Arrayコンストラクター)。2つのビューはメモリの同じセグメントに対応しているため、一方のビューが基になるメモリを変更すると、もう一方のビューに影響します。

const buffer = new ArrayBuffer(12);
const x1 = new Int32Array(buffer);
x1[0] = 1;
const x2 = new Uint8Array(buffer);
x2[0]  = 2;
x1[0]
复制代码

ArrayBuffer.isView()

ArrayBuffer有一个静态方法isView,返回一个布尔值,表示参数是否为ArrayBuffer的视图实例。这个方法大致相当于判断参数,是否为TypedArray实例或DataView实例。

const buffer = new Int32Array(buffer);
ArrayBuffer.isView(buffer)
复制代码

ArrayBuffer.prototype.slice()

ArrayBuffer实例有一个slice方法,允许将内存区域的一部分,拷贝生成一个新的ArrayBuffer对象。

const buffer = new ArrayBuffer(8);
const newBuffer = buffer.slice(0, 3);
复制代码

slice方法接受两个参数,第一个参数表示拷贝开始的字节序号(含该字节),第二个参数表示拷贝截止的字节序号(不含该字节)。如果省略第二个参数,则默认到原ArrayBuffer对象的结尾。

除了slice方法,ArrayBuffer对象不提供任何直接读写内存的方法,只允许在其上方建立视图,然后通过视图读写。

ArrayBuffer.prototype.byteLength

ArrayBuffer实例的byteLength属性,返回所分配的内存区域的字节长度。

const buffer = new ArrayBuffer(32);
buffer.byteLength
// 32
复制代码

如果要分配的内存区域很大,有可能分配失败(因为没有那么多的连续空余内存),所以有必要检查是否分配成功。

おすすめ

転載: juejin.im/post/7085635148498075655