JavaScript/型付き配列

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

型付き配列(かたつきはいれつ、Typed array)は特定のデータ型を持つ要素しか扱えないという制限があります。 つまり、整数型のみ、あるいは浮動小数点数型のみを扱うことができます。 型付き配列を使うことで、メモリの効率的な利用や、高速なデータ処理が可能になるため、JavaScriptのプログラマにとっては非常に重要な知識と言えます。

概要[編集]

型付き配列は、C言語の配列のように要素数を予め決め全ての要素の型が同じオブジェクトなインデックス可能なコレクションです。

型付き配列を使って浮動小数点数のビットパターンを表示する
const f64 = new Float64Array([0, 1, NaN, Infinity, -Infinity, Math.PI])
const b64 = new BigUint64Array(f64.buffer)
f64.forEach((x, i) =>
  console.log(`${(""+x).padStart(17," ")}: ${b64[i].toString(2).padStart(64, "0")}`) )
実行結果
                0: 0000000000000000000000000000000000000000000000000000000000000000
                1: 0011111111110000000000000000000000000000000000000000000000000000
              NaN: 0111111111111000000000000000000000000000000000000000000000000000
         Infinity: 0111111111110000000000000000000000000000000000000000000000000000
        -Infinity: 1111111111110000000000000000000000000000000000000000000000000000
3.141592653589793: 0100000000001001001000011111101101010100010001000010110100011000
行ごとに説明しましょう。
  1. Float64Arrayオブジェクトf64を [0, 1, NaN, Infinity, -Infinity, Math.PI] をパラメータとして生成
  2. BigUint64Arrayオブジェクトb64をFloat64Arrayオブジェクトのバッファを引数に生成
  3. Float64Arrayの要素を順に
  4.  BigUint64Arrayを使って二進文字列化

6種類のIEEE 75464ビット倍精度浮動小数点数のバイナリ表現を表示したもので、TypedArray を使うと内部表現へのアクセスが buffer プロパティを使って可能になる事を示す例となっています。

この様な ArrayBuffer を扱うためには、DataViewオブジェクトが用意されていますが今回は同じ64ビット同士にすることでエンディアンの問題を回避しました。

TypedArray オブジェクト[編集]

TypedArray はコンストラクターとしては呼び出さず、Float64ArrayオブジェクトやBigUint64Arrayオブジェクトのような TypedArray オブジェクトのインスタンスを生成します。

Int8Array[編集]

8ビット符号付き整数のTypedArrayオブジェクト

Uint8Array[編集]

8ビット符号なし整数のTypedArrayオブジェクト

Uint8ClampedArray[編集]

オーバーフロー対策と丸め処理を施された8ビット符号なし整数のTypedArrayオブジェクト。

以下の変換規則に従います[1]

  • 数値に変換する
  • NaN, +0, -0, Infinity 及び -Infinity は+0とする
  • 0未満は0に丸める
  • 255を超えると255に丸める
  • 最近接偶数丸めを行う

Canvas#imageData へのアクセスを使った高速化の節に、CanvasのimageDate.data(Uint8ClampedArrayオブジェクト)を直接操作して高速化をはかる例がある。

const ui8c = new Uint8ClampedArray(1);
[ NaN, +0, -0, -1, 256, 0.5, 0.5000000000001, 1.5, 1.5000000000001, ].forEach(x => console.log(ui8c[0] = x, ui8c[0]));
/*
 NaN 0
 0 0
 -0 0
 -1 0
 256 255
 0.5 0
 0.5000000000001 1
 */

Int16Array[編集]

16ビット符号付き整数のTypedArrayオブジェクト

Uint16Array[編集]

16ビット符号なし整数のTypedArrayオブジェクト

Int32Array[編集]

32ビット符号付き整数のTypedArrayオブジェクト

Uint32Array[編集]

32ビット符号なし整数のTypedArrayオブジェクト

Float32Array[編集]

32ビット単精度浮動小数点数のTypedArrayオブジェクト

Float64Array[編集]

64ビット倍精度浮動小数点数のTypedArrayオブジェクト (組み込み数値プリミティブと同じ精度)

BigInt64Array[編集]

64ビット符号付き整数のTypedArrayオブジェクト

BigUint64Array[編集]

64ビット符号なし整数のTypedArrayオブジェクト

脚註[編集]

  1. ^ ECMA-262::7.1.12 ToUint8Clamp ( argument )

外部リンク[編集]

このページ「JavaScript/型付き配列」は、まだ書きかけです。加筆・訂正など、協力いただける皆様の編集を心からお待ちしております。また、ご意見などがありましたら、お気軽にトークページへどうぞ。