配列バッファー(ArrayBuffer)

目次

配列バッファーの作成

new ArrayBuffer()

配列バッファー(ArrayBuffer)を作成します。ArrayBuffer はデータを格納するバイト列のメモリ領域です。ArrayBuffer には直接アクセスすることはできず、型付き配列(TypedArray) またはデータビュー(DataView) をマッピングしてアクセスします。下記の例では 12 バイトの ArrayBuffer を作成し、それに 2バイト長×6個の要素からなる Int16Array 型付き配列をマッピングしています。

const buf = new ArrayBuffer(12);
const arr = new Int16Array(buf);
console.log(arr);

ArrayBuffer.isView(array)

array が型付き配列(TypedArray) またはデータビュー(DataView) であれば true を、さもなくば false を返します。

const arr = new Int16Array(3);
console.log(ArrayBuffer.isView(arr));            // => true

配列バッファーのリサイズ

arraybuffer.byteLength

ArrayBuffer のサイズをバイト単位で返します。

const buf = new ArrayBuffer(12);
console.log(buf.byteLength);            // => 12

maxByteLength

作成時に { maxByteLength: bytes } を指定することで、領域としては bytes バイトの領域をあらかじめ確保しておき、その範囲内でリサイズ可能な ArrayBuffer を作成することができます。プロパティ maxByteLength は作成時に指定した最大バイト数を返します。

const buf = new ArrayBuffer(12, { maxByteLength: 24 });
console.log(buf.byteLength);             // => 12
console.log(buf.maxByteLength);          // => 24
buf.resize(24);
console.log(buf.byteLength);             // => 24

arrayBuffer.resizable

ArrayBuffer がリサイズ可能な否かを true または false で示します。

const buf = new ArrayBuffer(12, { maxByteLength: 24 });
console.log(buf.resizable);             // => true

arrayBuffer.resize(n)

ArrayBuffer を 0~maxByteLength の範囲内でリサイズします。

const buf = new ArrayBuffer(12, { maxByteLength: 24 });
buf.resize(24);

配列バッファーの複製

arrayBuffer.slice(start, end)

新しい ArrayBuffer を作成し、元のバッファーの start から end - 1 バイト目の値をコピーします。end を省略した場合は最後までをコピーします。下記の例では 6 バイトの ArrayBuffer を作成し、その 2 バイト目から 5 - 1 = 4 バイト目の 3バイトをコピーした新たな ArrayBuffer を作成しています。

const buf1 = new ArrayBuffer(6);
const arr1 = new Int8Array(buf1);
arr1.set([1, 2, 3, 4, 5, 6]);
const buf2 = buf1.slice(2, 5);
const arr2 = new Int8Array(buf2);
console.log(arr2);                    // => Int8Array(3) [3, 4, 5]

arrayBuffer.transfer(bytes)

bytes バイトの新しい ArrayBuffer を返却します。元データを arrayBuffer からコピーします。短くなる場合は切捨てられ、長くなる場合は 0 が埋められます。元のバッファのリサイズ可否も継承します。元のバッファーは削除(デタッチ)されます。ES2024 で追加されました。

const buf1 = new ArrayBuffer(8, { maxByteLength: 32 });
console.log(buf1.byteLength);                       // => 8
console.log(buf1.resizable);                        // => true
const buf2 = buf1.transfer(16);
console.log(buf2.byteLength);                       // => 16
console.log(buf2.resizable);                        // => true

arrayBuffer.transferToFixedLength(bytes)

bytes バイトの新しい ArrayBuffer を返却します。元データを arrayBuffer からコピーします。短くなる場合は切捨てられ、長くなる場合は 0 が埋められます。元のバッファのリサイズ可否は継承しません。元のバッファーは削除(デタッチ)されます。ES2024 で追加されました。

const buf1 = new ArrayBuffer(8, { maxByteLength: 32 });
console.log(buf1.byteLength);                       // => 8
console.log(buf1.resizable);                        // => true
const buf2 = buf1.transferToFixedLength(16);
console.log(buf2.byteLength);                       // => 16
console.log(buf2.resizable);                        // => false

arrayBuffer.detached

元のバッファーが transfer()transferToFixedLength() によってすでに削除(デタッチ)されているか否かを返します。

const buf1 = new ArrayBuffer(6);
console.log(buf1.detached);                // => false
const buf2 = buf1.transfer(4);
console.log(buf1.detached);                // => true