JavaScript/型付き配列

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

型付き配列(かたつきはいれつ、Typed array)とは、配列状のオブジェクトで全ての要素が同じ型を持ちます。

概要[編集]

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

実際のコードを示します。

const f64 = new Float64Array([0, 1, NaN, Infinity, -Infinity, Math.PI]);
const b64 = new BigUint64Array(f64.buffer);
for (let i = 0, len = f64.length; i < len; i++) 
  console.log(`${(""+f64[i]).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 プロパティを使って可能になる事を示す例となっています。

IEEE 754 Double Floating Point Format.svg

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

TypedArray オブジェクト[編集]

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

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