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