* 仕様書

[REFS[
- [68] [CITE[ECMAScript® 2018 Language Specification]] ([TIME[2017-06-14 04:16:40 +09:00]]) <https://tc39.github.io/ecma262/#sec-arraybuffer-objects>
- [47] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#dom-binarytype-arraybuffer>
]REFS]

* 状態

[2] 
[CODE(DOMi)@en[ArrayBuffer]] (や [CODE(DOMi)@en[SharedArrayBuffer]]) は [F(ss)[ArrayBufferData]] を持ちます。
値は[[データブロック][データブロック (JavaScript)]]または
[CODE[null]] です。
[[コンストラクター]]で[[データブロック][データブロック (JavaScript)]]に設定されます。
[CODE[DetachArrayBuffer]] によって [CODE[null]] に変更されることがあります。

[3] 
[CODE(DOMi)@en[ArrayBuffer]] (や [CODE(DOMi)@en[SharedArrayBuffer]])
は [F(ss)[ArrayBufferByteLength]] を持ちます。
値は [F(ss)[ArrayBufferData]] の[[バイト長]]を表す[[整数]]となっています。
[CODE[DetachArrayBuffer]] によって [N[0]] に変更されることがあります。

[4] 
[[JavaScript]] の[[仕様書]]の[[演算]]や[[構造化クローン]]では、
[CODE(DOMi)@en[ArrayBuffer]] かどうかの判断には 
[F(ss)[ArrayBufferData]] [[内部スロット]]の有無を調べています。
この条件だけでは [CODE(DOMi)@en[SharedArrayBuffer]] も該当してしまうので、
その区別が必要な場合には、更に [F(ss)[ArrayBufferData]] が[[共有データブロック]]かを調べています。

* 演算

[20] 
[CODE[byteLength]] [[プロパティー]]で[[バイト長]] ([[バイト列]]の[[長さ]] =
[[バイト]]の数) を取得できます。

[19] 
[CODE[ArrayBuffer]] は[[バイト列]]を表していますが、
その[[バイト]]に直接アクセスはできません。
その
[CODE[ArrayBuffer]]
を操作するための[[型付き配列型]]の[[オブジェクト]]を作る必要があります。

-*-*-

[11] 
[[仕様書]]で使われる内部の[[演算]]として、
[[detach]] に関する
[CODE[IsDetachedBuffer]] と
[CODE[DetachArrayBuffer]] があります。

* 文脈

[5] 
[CODE(DOMi)@en[ArrayBuffer]] [[コンストラクター]]に[[バイト数]]を指定することで、
([CODE[AllocateArrayBuffer]] により)
指定した[[長さ]]の [CODE(DOMi)@en[ArrayBuffer]] の[[インスタンス]]を作成できます。

[21] 
[CODE[AllocateArrayBuffer]]
は
[CODE[CreateByteDataBlock]]
を呼び出します。
[CODE[CreateByteDataBlock]] は値 [N[0]] の[[バイト]]で構成される[[バイト列]]の[[データブロック]]を生成して返します。

[22] 
つまり、 [CODE[ArrayBuffer]] [[構築子]]で新規作成したバッファーは [N[0x00]] 
の列となっていることが保証されます。

;; [23] [[プログラミング言語]]や[[プラットフォーム]]によっては[[メモリー領域]]を確保しても初期化されていることが保証されないことがありますが、
[CODE[ArrayBuffer]] はそのような[[プラットフォーム]]とは異なり、
必ず [CODE[NULL]] に初期化されるということです。

-*-*-

[7] 
[CODE(DOMi)@en[ArrayBuffer]] [[オブジェクト]]の
[CODE(DOMm)@en[slice]] [[メソッド]]は、新しい [CODE(DOMi)@en[ArrayBuffer]]
[[オブジェクト]]を作成します。

[9] 
[[型付き配列]]に関する操作で[[型付き配列]]の[[インスタンス]]が新たに作成される場合、
付随して [CODE(DOMi)@en[ArrayBuffer]] の[[インスタンス]]も新たに作成されることがあります。

;; [[型付き配列]]参照。

[6] 
[[型付き配列]]の [CODE(DOMm)@en[set]] [[メソッド]]の内部処理でも
[CODE(JS)@en[ArrayBuffer]] が作成されます。

[8] [CODE[ReadableStream]] の処理から呼び出されることがある内部処理
[CODE[TransferArrayBuffer]] は既存の[[データブロック][データブロック (JavaScript)]]を使って新しい
[CODE(JS)@en[ArrayBuffer]] を作成します。
既存の [CODE(JS)@en[ArrayBuffer]] は [CODE[DetachArrayBuffer]] されます。

[81] 
[CODE(DOMa)@en[arrayBuffer]] [[メソッド]]は、
[CODE(DOMi)@en[ArrayBuffer]] の[[インスタンス]]を返します。
その他の [[fetch]] の処理も [CODE(DOMi)@en[ArrayBuffer]] や
[CODE(DOMi)@en[Uint8Array]] を内部的に作成することがあります。

[10] 
[[構造化クローン]]により作成されることがあります。


** [CODE(DOMi)@en[BinaryType]] の値 [CODE(DOM)@en[arraybuffer]]

[48] [[列挙型]] [CODE(DOMi)@en[[[BinaryType]]]] の値
[DFN[[CODE(DOM)@en[[[arraybuffer]]]]]] は、 [CODE(DOMi)@en[[[ArrayBuffer]]]]
として返すべきことを表します [SRC[>>47]]。

[80] 
この値が指定された時、 [[WebSocket]] の [CODE(DOMe)@en[message][onmessage]]
[[イベント]]の [CODE(DOMa)@en[data][data (MessageEvent)]]
[[IDL属性]]の値は [CODE(JS)@en[ArrayBuffer]] となります。

* ごみ収集

[12] [CODE[ArrayBuffer]] は通常の[[オブジェクト]]と同じように[[ごみ収集]]できます。

[13] [[detach]] されていない [CODE[ArrayBuffer]] は[[データブロック][データブロック (JavaScript)]]を持ちますが、
この[[データブロック][データブロック (JavaScript)]]は複数の
[CODE[ArrayBuffer]] から[[参照]]されている可能性がありますから、
同時に[[ごみ収集]]されるとは限りません。


* 歴史

;; [1] [[Typed Array]] の歴史の項も参照。


[14] [CITE@en[WebAssembly JS and Web integration spec in Bikeshed by littledan · Pull Request #591 · WebAssembly/spec]]
([TIME[2017-12-08 01:55:53 +09:00]])
<https://github.com/WebAssembly/spec/pull/591>

[15] [CITE@en[Disallow ArrayBuffers bigger than 2**53 · Issue #1032 · tc39/ecma262]]
([TIME[2017-12-19 00:55:50 +09:00]])
<https://github.com/tc39/ecma262/issues/1032>

[16] [CITE@en[Detached ArrayBuffer objects should not throw]]
([[annevk]]著, [TIME[2019-01-10 18:00:09 +09:00]])
<https://github.com/heycam/webidl/commit/6ec828c6e5eb383e11ffab527444656ec133e260>

[17] [CITE@en["get a copy of the bytes held by the buffer source" should not fail for detached buffers · Issue #151 · heycam/webidl]]
([TIME[2019-06-05 20:06:29 +09:00]])
<https://github.com/heycam/webidl/issues/151>

[18] [CITE@en[Detached ArrayBuffer objects should not throw by annevk · Pull Request #605 · heycam/webidl]]
([TIME[2019-06-05 20:06:41 +09:00]])
<https://github.com/heycam/webidl/pull/605>