ArrayBuffer
ArrayBuffer
オブジェクトは、JavaScriptがバイナリデータを操作するためのインターフェイスです。個別の仕様(2011年2月にリリース)として、ES6はそれらをECMAScript仕様に組み込みました。配列の構文でバイナリデータを処理するため、バイナリ配列と呼ばれます。
バイナリ配列が生まれたのはこの背景に反しています。これにより、開発者は配列の添え字の形式でメモリを直接操作できるようになり、JavaScriptがバイナリデータを処理する機能が大幅に強化されます。
バイナリ配列は3種類のオブジェクトで構成されますArrayBuffer
。TypedArray
つまりDataView
、ArrayBuffer
オブジェクトはプリミティブバイナリデータを表し、TypedArray
ビューは単純なタイプのバイナリデータのDataView
読み取りと書き込みに使用され、ビューは複雑なタイプのバイナリデータの読み取りと書き込みに使用されます。
ArrayBufferオブジェクト
ArrayBuffer
オブジェクトは、バイナリデータを格納するメモリの一部を表します。直接読み取りまたは書き込みはできませんが、ビュー(TypedArray
ビューおよびDataView
ビュー)を介してのみ読み取りおよび書き込みができます。ビューの機能は、指定された形式のバイナリデータを解釈することです。
ArrayBuffer
また、データを格納できる連続したメモリ領域を割り当てるコンストラクタでもあります。32バイトのメモリ領域では、各バイトの値はデフォルトで0です。ご覧のとおりArrayBuffer
、コンストラクターのパラメーターは必要なメモリー(バイト)です。
const buf = new ArrayBuffer(32);
复制代码
DataView
ArrayBuffer
ビューを作成するには、オブジェクトインスタンスをパラメータとして指定する必要があります。ビューを作成し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
复制代码
如果要分配的内存区域很大,有可能分配失败(因为没有那么多的连续空余内存),所以有必要检查是否分配成功。