TypedArray

TypedArray

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

目次

  1. 仕様書
  2. 意味
  3. 状態
  4. 文脈
  5. 比較
  6. 変換
  7. 歴史
    1. バイト列のない時代
    2. CanvasPixelArray
    3. 型付き配列型
    4. ES6 への統合

仕様書#

意味#

[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