TypedArray
TypedArray オブジェクトは、背後にあるバイナリーデータバッファーの、配列風のビューを表します。 TypedArray という名称のグローバルプロパティは存在せず、また直接 TypedArray コンストラクターが見えるわけではありません。代わりに、さまざまなグローバルプロパティがあり、それらの値は後述するように特定の要素の型における型付き配列のコンストラクターになります。下記のページで、それぞれの要素を持つ片引き配列で使用できる共通のプロパティやメソッドを確認できます。
試してみましょう
解説
TypedArray コンストラクター(よく %TypedArray% と表記されます。JavaScript プログラムに公開されるグローバルに対応するものがあるわけではないため、「個別のもの」を表すためです)は、すべての TypedArray のサブクラスの共通のスーパークラスとして機能します。%TypedArray% はすべての型付き配列のサブクラスに対してユーティリティメソッドの共通インターフェイスを提供する「抽象クラス」であると考えてください。このコンストラクターは直接公開されていません。グローバルプロパティである TypedArray プロパティは存在しません。オブジェクト.getPrototypeOf(Int8Array) などを通してのみアクセスすることができます。
TypedArray のサブクラス(例えば Int8Array)のインスタンスを作成する際、配列バッファーがメモリーに内部作成されるか、コンストラクターの引数に ArrayBuffer オブジェクトが指定されると、代わりにその ArrayBuffer を使用します。バッファーアドレスはインスタンスの内部プロパティとして保存され、%TypedArray%.prototype のすべてのメソッドがその配列バッファーアドレスに基づいて値を設定したり取得したりします。
TypedArray オブジェクト
| 型 | 値の範囲 | サイズ (バイト数) | 説明 | Web IDL 型 | 同等の C 型 |
|---|---|---|---|---|---|
Int8Array |
-128 から 127 | 1 | 8 ビット長、2 の補数方式の符号付き整数値 | byte |
int8_t |
Uint8Array |
0 から 255 | 1 | 8 ビット長、符号なし整数値 | octet |
uint8_t |
Uint8ClampedArray |
0 から 255 | 1 | 8 ビット長、符号なし整数値 (切り詰め) | octet |
uint8_t |
Int16Array |
-32768 から 32767 | 2 | 16 ビット長、2 の補数方式の符号付き整数値 | short |
int16_t |
Uint16Array |
0 から 65535 | 2 | 16 ビット長、符号なし整数値 | unsigned short |
uint16_t |
Int32Array |
-2147483648 から 2147483647 | 4 | 32 ビット長、2 の補数方式の符号付き整数値 | long |
int32_t |
Uint32Array |
0 から 4294967295 | 4 | 32 ビット長、符号なし整数値 | unsigned long |
uint32_t |
Float32Array |
-3.4E38 から 3.4E38 および 1.2E-38 (最小の正の数) |
4 | 32-bit IEEE floating point number (7 significant digits e.g., 1.234567)1.2×10-38 から 3.4×1038 |
4 | 32 ビット長 IEEE 方式浮動小数点数 (有効桁数 7 桁、例えば 1.234567) |
Float64Array |
-1.8E308 から 1.8E308 および 5E-324 (最小の正の数) |
8 | 64 ビット長 IEEE 方式浮動小数点数 (有効桁数 16 桁、例えば1.23456789012345) |
unrestricted double |
double |
BigInt64Array |
-263 to 263 - 1 | 8 | 64 ビット長、2 の補数方式の符号付き整数値 | bigint |
int64_t (signed long long) |
BigUint64Array |
0 to 264 - 1 | 8 | 64 ビット長、符号なし整数値 | bigint |
uint64_t (unsigned long long) |
サイズ変更可能なバッファー表示時の動作について
サイズ変更可能なバッファーのビューとして TypedArray を作成した場合、TypedArray が長さを追跡するよう構築されているかどうかにより、基盤のバッファーをサイズ変更した際に TypedArray のサイズに様々な影響を与えます。
3つ目の引数を除外したり、undefined を渡したりして、固有のサイズを持たない型付き配列を作成した場合、型付き配列は 長さ追跡 となり、後者のサイズが変更されると、基盤となる buffer に合わせて自動的にサイズ変更されます。
js
const buffer = new ArrayBuffer(8, { maxByteLength: 16 });
const float32 = new Float32Array(buffer);
console.log(float32.byteLength); // 8
console.log(float32.length); // 2
buffer.resize(12);
console.log(float32.byteLength); // 12
console.log(float32.length); // 3
型付き配列を 3 つ目の length 引数で具体的なサイズを指定して作成した場合、後者が大きくなっても buffer を格納するためにサイズを変更することはありません。
js
const buffer = new ArrayBuffer(8, { maxByteLength: 16 });
const float32 = new Float32Array(buffer, 0, 2);
console.log(float32.byteLength); // 8
console.log(float32.length); // 2
console.log(float32[0]) // 0(初期値)
buffer.resize(12);
console.log(float32.byteLength); // 8
console.log(float32.length); // 2
console.log(float32[0]); // 0(初期値)
buffer が縮小されるとき、見ている型付き配列が境界を越えることがあり、その場合、型付き配列の監視サイズは 0 に減少します。これは、長さ追跡を行わない型付き配列の長さが変化する唯一のケースです。
js
const buffer = new ArrayBuffer(8, { maxByteLength: 16 });
const float32 = new Float32Array(buffer, 0, 2);
buffer.resize(7);
console.log(float32.byteLength); // 0
console.log(float32.length); // 0
console.log(float32[0]); // undefined
その後、 buffer を再び大きくして型付き配列を元に戻せば、型付き配列のサイズは元の値に戻ります。
js
buffer.resize(8);
console.log(float32.byteLength); // 8
console.log(float32.length); // 2
console.log(float32[0]); // 0 - back in bounds again!
長さ追跡型の型付き配列でも、バッファーが byteOffset を超えて縮小された場合、同じことが起こり得る.
js
const buffer = new ArrayBuffer(8, { maxByteLength: 16 });
const float32 = new Float32Array(buffer, 4);
// float32 は長さを追跡しますが、4 バイト目からバッファー末尾までしか
// 拡張しないので、バッファーが 4 バイトより短くなるようにリサイズされる
// と、配列の型が範囲外になってしまいます。
buffer.resize(3);
console.log(float32.byteLength); // 0
コンストラクター
このオブジェクトは直接インスタンス化できません。new で構築しようとすると TypeError が発生します。
js
new (Object.getPrototypeOf(Int8Array))();
// TypeError: Abstract class TypedArray not directly constructable
その代わり、Int8Array や BigInt64Array のような特定の種類の型付き配列のインスタンスを作成してください。これらのオブジェクトは、すべてコンストラクターに共通の構文を持っています。
js
new TypedArray()
new TypedArray(length)
new TypedArray(typedArray)
new TypedArray(object)
new TypedArray(buffer)
new TypedArray(buffer, byteOffset)
new TypedArray(buffer, byteOffset, length)
ここで TypedArray は特定の型のコンストラクターのうちの一つを表します。
引数
typedArray-
TypedArrayのサブクラスのインスタンスを指定して呼び出されると、typedArrayが新しい型付き配列にコピーされます。長整数以外のTypedArrayコンストラクターでは、typedArray引数には長整数以外の型付き配列のうちのいずれか(Int32Arrayなど)を指定します。同様に、長整数のTypedArrayコンストラクター(BigInt64ArrayまたはBigUint64Array)では、typedArray引数には長整数型のいずれかしか指定できません。typedArrayの各値は、新しい配列にコピーされる前にコンストラクターの対応する型に変換される。新しい型付き配列の長さはtypedArrayの引数の長さと同じになります。 object-
TypedArrayインスタンスでないオブジェクトで呼び出された場合、TypedArray.from()メソッドと同じ方法で、新しい型付き配列を生成します。 length省略可-
オブジェクト以外で呼び出された場合、引数は型付き配列の長さを指定する数値として扱われます。内部配列バッファーがメモリー内に作成され、サイズは
lengthにBYTES_PER_ELEMENTバイトを乗じたものとなり、0 で満たされます。すべての引数を除外すると、0をlengthとして使用することと同じになります。 buffer,byteOffset省略可,length省略可-
ArrayBufferまたはSharedArrayBufferインスタンスを指定し、さらにbyteOffsetおよびlength引数を付けて呼び出すと、指定したバッファーを参照する型付き配列ビューを新たに作成することができます。byteOffsetとlengthの引数は、型付き配列ビューが参照するメモリー範囲を指定します。両方とも省略した場合、bufferの全体が参照されます。lengthのみが省略された場合、bufferのbyteOffset以降の部分が表示されます。lengthが省略された場合、型付き配列は長さ追跡となります。
例外
すべての TypeArray サブクラスのコンストラクターは、同じように操作します。すべてで以下のような例外を発生することがあります。
TypeError-
以下のいずれかの場合に発生します。
typedArrayが渡されたが、現在のコンストラクターとは異なり長整数型のものであった場合、またはその逆。typedArrayが渡されたが、そのバッファーが分離されていた場合、または分離されたbufferが直接渡された場合。
RangeError-
以下のいずれかの場合に発生します。
- 新しい型付き配列の長さが長すぎる。
buffer(length引数を指定しない場合)またはbyteOffsetの長さが、新しい型付き配列の要素サイズの整数倍でない。byteOffsetが有効な配列インデックス(0 から 253 - 1 の間の整数)でない。- バッファーからビューを作成する場合、境界がバッファーの外側になる。言い換えれば、
byteOffset + length * TypedArray.BYTES_PER_ELEMENT > buffer.byteLengthとなる。
静的プロパティ
これらのプロパティは TypedArray コンストラクターオブジェクトで定義されており、したがってすべての TypedArray サブクラスのコンストラクターで共有されます。
get TypedArray[@@species]-
派生オブジェクトを作成するために使用されるコンストラクター関数です。
すべての TypedArray サブクラスには以下の静的プロパティもあります。
TypedArray.BYTES_PER_ELEMENT-
さまざまな
TypedArrayオブジェクトの要素のサイズを数値で返します。 TypedArray.name-
コンストラクターの名前を文字列値で返します(例:
"Int8Array")。
静的メソッド
これらのメソッドは TypedArray コンストラクターオブジェクトに定義されているため、すべての TypedArray のサブクラスのコンストラクターに共有されます。
TypedArray.from()-
配列風オブジェクトや反復可能オブジェクトから、新たな
TypedArrayを生成します。Array.from()もご覧ください。 TypedArray.of()-
引数に与えた値をもとに、新たな
TypedArrayを生成します。Array.of()もご覧ください。
インスタンスプロパティ
これらのプロパティは TypedArray のプロトタイプオブジェクトで定義されており、すべての TypedArray のサブクラスインスタンスで共有されています。
TypedArray.prototype.buffer-
この型付き配列によって参照さている
ArrayBufferを返します。 TypedArray.prototype.byteLength-
型付き配列の長さを (バイト単位で) 返します。
TypedArray.prototype.byteOffset-
型付き配列の
ArrayBufferの先頭からのオフセットを (バイト単位で) 返します。 TypedArray.prototype.constructor-
インスタンスオブジェクトを作成したコンストラクター関数です。
TypedArray.prototype.constructorは隠されたTypedArrayのコンストラクター関数ですが、型付き配列のサブクラスはそれぞれconstructorプロパティを定義しています。 TypedArray.prototype.length-
型付き配列内に保持された要素の数を返します。
TypedArray.prototype[@@toStringTag]-
TypedArray.prototype[@@toStringTag]プロパティの初期値はゲッターで、型付き配列の名前と同じ文字列を返します。このプロパティはthisの値が型付き配列のサブクラスのいずれでもない場合、undefinedを返します。このプロパティはObject.prototype.toString()で使用されます。ただし、TypedArrayは独自のtoString()メソッドを持っているので、このプロパティはObject.prototype.toString.call()をthisArgに型付き配列を設定して呼び出差ない限り、このプロパティの使用されません。
すべての TypedArray のサブクラスには、以下のインスタンスプロパティもあります。
TypedArray.prototype.BYTES_PER_ELEMENT-
様々な
TypedArrayオブジェクトの要素の大きさを数値で返します。
インスタンスメソッド
これらのメソッドは TypedArray プロトタイプオブジェクトに定義されているため、すべての TypedArray サブクラスインスタンスで共有されます。
TypedArray.prototype.at()-
整数値を受け取り、その位置にあるアイテムを返します。このメソッドでは負の整数を扱うことができ、最後の項目から逆向きに数えます。
TypedArray.prototype.copyWithin()-
配列内で一連の配列要素をコピーします。
Array.prototype.copyWithin()も参照してください。 TypedArray.prototype.entries()-
配列内のすべての位置に対するキー/値の組を含む、新しい配列イテレーターを返します。
Array.prototype.entries()も参照してください。 TypedArray.prototype.every()-
配列内のすべての要素が関数によって提供されたテストに合格するかどうかテストを実行します。
Array.prototype.every()も参照してください。 TypedArray.prototype.fill()-
開始位置から終了位置までのすべての要素に固定値を設定します。
Array.prototype.fill()も参照してください。 TypedArray.prototype.filter()-
与えられたフィルタリング関数が
trueを返す配列のすべての要素をもつ新しい配列を生成します。Array.prototype.filter()も参照してください。 TypedArray.prototype.find()-
配列要素が与えられたテスト関数を満足したら、配列の値を返します。満足しなかった場合、
undefinedを返します。Array.prototype.find()も参照してください。 TypedArray.prototype.findIndex()-
配列要素が与えられたテスト関数を満足したら、配列のインデックスを返します。満足しなかった場合は
-1を返します。Array.prototype.findIndex()も参照してください。 TypedArray.prototype.findLast()-
指定されたテスト関数を満たす配列の最後の要素の値を返し、適切な要素が得られなかった場合は
undefinedを返します。Array.prototype.findLast()も参照してください。 TypedArray.prototype.findLastIndex()-
指定されたテスト関数を満たす配列の最後の要素の添字を返し、適切な要素が見つからなかった場合は
-1を返します。Array.prototype.findLastIndex()も参照してください。 TypedArray.prototype.forEach()-
配列内の各要素に対する関数を呼び出します。
Array.prototype.forEach()も参照してください。 TypedArray.prototype.includes()-
型付き配列にある要素が含まれているかどうか判断し、それに応じて
trueまたはfalseを返します。Array.prototype.includes()も参照してください。 TypedArray.prototype.indexOf()-
指定された値に等しい配列内の要素の最初の位置を返します。見つからなかった場合は
-1を返します。Array.prototype.indexOf()も参照してください。 TypedArray.prototype.join()-
すべての配列要素を 1 つの文字列に結合します。
Array.prototype.join()も参照してください。 TypedArray.prototype.keys()-
配列内のそれぞれの位置に対するキーを含む新しい配列イテレーターを返します。
Array.prototype.keys()も参照してください。 TypedArray.prototype.lastIndexOf()-
指定された値と等しい配列の要素の最後の位置を返します。見つからない場合は
-1を返します。Array.prototype.lastIndexOf()を確かめて下さい。 TypedArray.prototype.map()-
この配列のすべての要素で与えられた関数を呼び出した結果をもつ新しい配列を生成します。
Array.prototype.map()も参照してください。 TypedArray.prototype.reduce()-
アキュームレーターと配列のそれぞれの値(左から右へ)に対して関数を適用し、単一の値にまで縮小します。
Array.prototype.reduce()も参照してください。 TypedArray.prototype.reduceRight()-
アキュームレーターと配列のそれぞれの値(右から左へ)に対して関数を適用し、単一の値にまで縮小します。
Array.prototype.reduce()も参照してください。 TypedArray.prototype.reverse()-
配列要素の順番を反転させます。 — 最初の要素は最後になり、最後の要素は最初になります。
Array.prototype.reverse()も参照してください。 TypedArray.prototype.set()-
入力値を指定した配列から読み込み、型付き配列内に複数の値を格納します。
TypedArray.prototype.slice()-
配列の一部を取り出して新しい配列を返します。
Array.prototype.slice()も参照してください。 TypedArray.prototype.some()-
ある配列の少なくとも 1 つの要素が与えられたテスト関数を満たした場合に
trueを返します。Array.prototype.some()も参照してください。 TypedArray.prototype.sort()-
配列の要素をソートし、その結果を返します。
Array.prototype.sort()も参照してください。 TypedArray.prototype.subarray()-
与えられた開始位置と終了位置の要素インデックスから、新しい
TypedArrayを返します。 TypedArray.prototype.values()-
配列内のそれぞれの位置に対する値を含む新しい配列イテレーターオブジェクトを返します。
Array.prototype.values()も参照してください。 TypedArray.prototype.toLocaleString()-
配列と要素を表すローカライズされた文字列を返します。
Array.prototype.toLocaleString()も参照してください。 TypedArray.prototype.toString()-
配列と要素を表す文字列を返します。
Array.prototype.toString()も参照してください。 TypedArray.prototype[@@iterator]()-
配列内でそれぞれの位置に対する値を含む新しい配列イテレーターオブジェクトを返します。
例
プロパティへのアクセス
配列内の要素は、標準の配列の添字構文 (すなわち、かぎ括弧を使用する表記) を使用して参照することができます。しかし、型付き配列で添字付きプロパティで取得または設定するときは、範囲外の添字でもプロパティのプロトタイプチェーンを探索しません。添字付きプロパティは ArrayBuffer を調べるのであり、オブジェクトのプロパティは探索しません。他のオブジェクト同様に、名前付きプロパティは使用できます。
js
// 標準的な配列構文を使用して設定および取得
const int16 = new Int16Array(2);
int16[0] = 42;
console.log(int16[0]); // 42
// プロトタイプで添字付き配列を使用しても探索しない (Fx 25)
Int8Array.prototype[20] = "foo";
new Int8Array(32)[20]; // 0
// even when out of bound
Int8Array.prototype[20] = "foo";
new Int8Array(8)[20]; // undefined
// or with negative integers
Int8Array.prototype[-1] = "foo";
new Int8Array(8)[-1]; // undefined
// 名前付きプロパティも利用できる (Fx 30)
Int8Array.prototype.foo = "bar";
new Int8Array(32).foo; // "bar"
凍結できない
空でない TypedArray は凍結することができません。その基盤である ArrayBuffer はそのバッファーの別の TypedArray ビューを通して変更される可能性があるためです。これはオブジェクトが純粋に凍結されることがないことを意味しています。
js
const i8 = Int8Array.of(1, 2, 3);
Object.freeze(i8);
// TypeError: Cannot freeze array buffer views with elements
ByteOffset は正規化する必要がある
ArrayBuffer にビューとして TypedArray を構築した場合、byteOffset 引数は要素サイズの境界に配置する必要があります。言い換えれば、オフセットは BYTES_PER_ELEMENT の倍数でなければなりません。
js
const i32 = new Int32Array(new ArrayBuffer(4), 1);
// RangeError: start offset of Int32Array should be a multiple of 4
js
const i32 = new Int32Array(new ArrayBuffer(4), 0);
ByteLength は正規化する必要がある
byteOffset 引数と同様に、TypedArray のコンストラクターに渡される ArrayBuffer の byteLength プロパティも、コンストラクターの BYTES_PER_ELEMENT の倍数にする必要があります。
js
const i32 = new Int32Array(new ArrayBuffer(3));
// RangeError: byte length of Int32Array should be a multiple of 4
js
const i32 = new Int32Array(new ArrayBuffer(4));
仕様書
| Specification |
|---|
| ECMAScript Language Specification # sec-typedarray-objects |
ブラウザーの互換性
BCD tables only load in the browser
関連情報
- 型付き配列のポリフィル (
core-js) - JavaScript の型付き配列
ArrayBufferDataView- TextDecoder — 数値データから文字列をデコードするヘルパー