JavaScript/型付き配列
型付き配列(かたつきはいれつ、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
- 行ごとに説明しましょう。
- Float64Arrayオブジェクトf64を
[0, 1, NaN, Infinity, -Infinity, Math.PI]
をパラメータとして生成 - BigUint64Arrayオブジェクトb64をFloat64Arrayオブジェクトのバッファを引数に生成
- Float64Arrayの要素を順に
- BigUint64Arrayを使って二進文字列化
6種類のIEEE 754の64ビット倍精度浮動小数点数のバイナリ表現を表示したもので、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オブジェクト