Typed Array

Typed Array

[47] 型付き配列 (typed array) は、 バイナリーデータ (バイト列) を配列と似た API で扱うことができる JavaScriptクラス群です。

仕様書

意味

[27] 型付き配列型 (typed array type) は、次のです >>26

[41] ArrayBufferView とは、型付き配列型または DataView をいいます >>39, >>30

[31] ArrayBufferView は、 BufferSource にも含まれています。

状態

[71] 型付き配列は、 TypedArrayName を持ちます。 値は種別 (Int8Array など) を表しています。 JavaScript仕様書上のオブジェクトの取り扱いにおいては、 この内部スロットの有無で型付き配列かどうかを判別しています。

[72] ArrayBufferView は、 ViewedArrayBuffer を持ちます。 値は ArrayBuffer です。 構造化クローンStreams Standardオブジェクトの取り扱いにおいては、 この内部スロットの有無で ArrayBufferView かどうかを判別しています。

[29] ただの ArrayBuffer ではなく、 SharedArrayBuffer の場合もあります。

[74] ArrayBufferView は、 ByteOffsetByteLength を持ちます。それぞれ、 ViewedArrayBufferバイト列におけるオフセット長さを表しています。 本 ArrayBufferView は、バッファー上の該当範囲を表しています。

[75] 型付き配列は、 ArrayLength を持ちます。配列としての長さ (要素数) を表しています。各要素のバイト長が1バイトとは限らないので、 ByteLength とは一致するとは限りません。

[73] これら内部スロットの値は、 コンストラクター内で設定され、以後変化することはありません。

文脈

[76] ArrayBufferView の各クラスインスタンスは、 コンストラクターにより作成することができます。 ArrayBuffer/SharedArrayBuffer を指定した場合は、それが ViewedArrayBuffer に設定されます。 それ以外の場合、新しい ArrayBuffer が作成されます。

[40] 型付き配列subarray, slice, filter, mapメソッドは新しい型付き配列インスタンスを作成します。 subarray は同じ ArrayBuffer/SharedArrayBuffer を共有することになりますが、それ以外は新しい ArrayBuffer を作成します。

[77] ArrayBufferView の各クラスインスタンスは、 ReadableByteStreamController により (入力と同じクラスのものが) 作成される場合があります。

[78] Uint8Arrayインスタンスは、 ReadableByteStreamController により作成される場合があります。

[79] Uint8ClampedArrayインスタンスは、 ImageData オブジェクトdata IDL属性から得られます。

[81] fetch の処理も ArrayBufferUint8Array を内部的に作成することがあります。

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

比較

[83] TypedArray等しいかどうか比較は、 組み込みの方法はなく、 自分で実装するほかないようです。

変換

[84] ArrayBuffer から TypedArray を得るには、 TypedArrayコンストラクターを使うといいです。

typedArray = new Uint8Array (arrayBuffer);

[85] TypedArray から Array を得るには、 Array.from を使うといいです。

array = Array.from (typedArray);

歴史

バイト列のない時代

[86] JavaScript には長らくバイト列専用のデータ型がありませんでしたが、 バイト列を表す需要がないわけではありませんでした。 慣用句的な表現方法がいくつかありました。

CanvasPixelArray

[52] Web Applications 1.0canvasgetImageData と共に CanvasPixelArray を規定しました。

型付き配列型

[21] ECMAScript Typed Array Specification ははじめ Khronos で標準化されました。

[23] canvas 要素CanvasPixelArray は、2011年に Uint8ClampedArray に変更されています。

ES6 への統合

[22] その後 TypedArrayES6 に取り込まれました。

[53] Web IDL でも型付き配列型その他を扱うためのデータ型が追加されました。

[38] >>37バッファー源型が導入されました。また HTML Standard にあった ArrayBufferView の定義が Web IDL に含まれるようになりました。 旧 ArrayBufferDataBufferSource に改称されました。

[46] W3C bug 27110. Fix the typo in the BufferSource typedef. · 74480d0 · heycam/webidl ( ( 版)) https://github.com/heycam/webidl/commit/74480d06c359ca407691818f1963f208d60434ea

[55] Update ECMAScript and IDL integration · whatwg/html@52f96c4 ( 版) https://github.com/whatwg/html/commit/52f96c455a53763a7fe00162c067da6adb20e62c

[56] Fix #26: allocating an ArrayBuffer can fail · whatwg/xhr@6484330 ( 版) https://github.com/whatwg/xhr/commit/6484330ec70ba66b9ee3a6b7244227180c0b4dce

[57] Write structured clone algorithm in terms of ECMAScript · whatwg/html@bfb960c ( 版) https://github.com/whatwg/html/commit/bfb960c938580c95e77365e614218b952f96375b

[58] Handle an ArrayBuffer allocation failure · whatwg/fetch@3004ebc ( 版) https://github.com/whatwg/fetch/commit/3004ebc878c9baf55cb22b32f66b8c5805824a70

[59] Use BufferSource instead of ArrayBuffer or ArrayBufferView. (mkruisselbrink著, ) https://github.com/w3c/FileAPI/commit/3eaebc7f1aea2a3c345d40401a3bed464414f63b

[60] 24072 – Clarify handling of neutered objects () https://www.w3.org/Bugs/Public/show_bug.cgi?id=24072

[61] Merge algo and dfn for "detaching an ArrayBuffer" (#210) (tobie著, ) https://github.com/heycam/webidl/commit/9d054100b8d599a31a549d664b9dcb780b3d638c

[62] Only fail to allocate an ArrayBuffer once (annevk著, ) https://github.com/whatwg/xhr/commit/33e1e973af1ba0dc640699e2a3a3175a3a3cfd05

[63] Breaking: refactor structured clone into serialize/deserialize (domenic著, ) https://github.com/whatwg/html/commit/97d644c97335956610a31e8ad98d1a388c063e84

[64] Breaking: refactor structured clone into serialize/deserialize (domenic著, ) https://github.com/whatwg/html/commit/97d644c97335956610a31e8ad98d1a388c063e84

[65] Add [AllowShared] to allow accepting SharedArrayBuffers (domenic著, ) https://github.com/heycam/webidl/commit/c59bdcbcf2039c89eb7ea9a35e1e2dba621519ec

[66] Throwing when converting detached ArrayBuffers is not what browsers do · Issue #352 · heycam/webidl () https://github.com/heycam/webidl/issues/352

[67] Replace TypedArray spec and IDL links with links to ECMAScript spec · Issue #2203 · KhronosGroup/WebGL () https://github.com/KhronosGroup/WebGL/issues/2203

[48] Uint8ClampedArray does not have a [[Detached]] internal slot (annevk著, ) https://github.com/whatwg/html/commit/29d83435dac041e56f0f4d7076edfd6f2afadd4b

[68] [[ViewedArrayBuffer]] cannot be undefined during usage (annevk著, ) https://github.com/heycam/webidl/commit/2084c30eb54c9c1dd6662e56345a5f17797653e5

[70] [[ViewedArrayBuffer]] cannot be undefined during usage (annevk著, ) https://github.com/heycam/webidl/commit/2084c30eb54c9c1dd6662e56345a5f17797653e5

[80] "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

[82] [[ViewedArrayBuffer]] cannot be undefined during usage by annevk · Pull Request #604 · heycam/webidl () https://github.com/heycam/webidl/pull/604