ArrayBuffer

ArrayBuffer

仕様書

状態

[2] ArrayBuffer (や SharedArrayBuffer) は ArrayBufferData を持ちます。 値はデータブロックまたは null です。 コンストラクターでデータブロックに設定されます。 DetachArrayBuffer によって null に変更されることがあります。

[3] ArrayBuffer (や SharedArrayBuffer) は ArrayBufferByteLength を持ちます。 値は ArrayBufferData のバイト長を表す整数となっています。 DetachArrayBuffer によって 0 に変更されることがあります。

[4] JavaScript の仕様書の演算や構造化クローンでは、 ArrayBuffer かどうかの判断には ArrayBufferData 内部スロットの有無を調べています。 この条件だけでは SharedArrayBuffer も該当してしまうので、 その区別が必要な場合には、更に ArrayBufferData が共有データブロックかを調べています。

演算

[20] byteLength プロパティーでバイト長 (バイト列の長さ = バイトの数) を取得できます。

[19] ArrayBuffer はバイト列を表していますが、 そのバイトに直接アクセスはできません。 その ArrayBuffer を操作するための型付き配列型のオブジェクトを作る必要があります。


[11] 仕様書で使われる内部の演算として、 detach に関する IsDetachedBuffer と DetachArrayBuffer があります。

文脈

[5] ArrayBuffer コンストラクターにバイト数を指定することで、 (AllocateArrayBuffer により) 指定した長さの ArrayBuffer のインスタンスを作成できます。

[21] AllocateArrayBuffer は CreateByteDataBlock を呼び出します。 CreateByteDataBlock は値 0 のバイトで構成されるバイト列のデータブロックを生成して返します。

[22] つまり、 ArrayBuffer 構築子で新規作成したバッファーは 0x00 の列となっていることが保証されます。

[23] プログラミング言語やプラットフォームによってはメモリー領域を確保しても初期化されていることが保証されないことがありますが、 ArrayBuffer はそのようなプラットフォームとは異なり、 必ず NULL に初期化されるということです。

[7] ArrayBuffer オブジェクトの slice メソッドは、新しい ArrayBuffer オブジェクトを作成します。

[9] 型付き配列に関する操作で型付き配列のインスタンスが新たに作成される場合、 付随して ArrayBuffer のインスタンスも新たに作成されることがあります。

[6] 型付き配列の set メソッドの内部処理でも ArrayBuffer が作成されます。

[8] ReadableStream の処理から呼び出されることがある内部処理 TransferArrayBuffer は既存のデータブロックを使って新しい ArrayBuffer を作成します。 既存の ArrayBuffer は DetachArrayBuffer されます。

[81] arrayBuffer メソッドは、 ArrayBuffer のインスタンスを返します。 その他の fetch の処理も ArrayBuffer や Uint8Array を内部的に作成することがあります。

[10] 構造化クローンにより作成されることがあります。

BinaryType の値 arraybuffer

[48] 列挙型 BinaryType の値 arraybuffer は、 ArrayBuffer として返すべきことを表します >>47。

[80] この値が指定された時、 WebSocket の message イベントの data IDL属性の値は ArrayBuffer となります。

ごみ収集

[12] ArrayBuffer は通常のオブジェクトと同じようにごみ収集できます。

[13] detach されていない ArrayBuffer はデータブロックを持ちますが、 このデータブロックは複数の ArrayBuffer から参照されている可能性がありますから、 同時にごみ収集されるとは限りません。

歴史

[1] Typed Array の歴史の項も参照。

[14] WebAssembly JS and Web integration spec in Bikeshed by littledan · Pull Request #591 · WebAssembly/spec () https://github.com/WebAssembly/spec/pull/591

[15] Disallow ArrayBuffers bigger than 2**53 · Issue #1032 · tc39/ecma262 () https://github.com/tc39/ecma262/issues/1032

[16] Detached ArrayBuffer objects should not throw (annevk著, ) https://github.com/heycam/webidl/commit/6ec828c6e5eb383e11ffab527444656ec133e260

[17] "get a copy of the bytes held by the buffer source" should not fail for detached buffers · Issue #151 · heycam/webidl () https://github.com/heycam/webidl/issues/151

[18] Detached ArrayBuffer objects should not throw by annevk · Pull Request #605 · heycam/webidl () https://github.com/heycam/webidl/pull/605