型付き配列（typed array）

# 型付き配列（typed array）
## とは何か
[ArrayBuffer](https://qiita.com/toshi00ysm/items/ddd60c22aa58d16c8320)内のデータを読み書きするためのビュー。  
（[ArrayBuffer](https://qiita.com/toshi00ysm/items/ddd60c22aa58d16c8320)自身には読み書きする機能はなく、このtyped arrayと別述の[DataView](https://qiita.com/toshi00ysm/items/09404faf4c6c3921c800)とがその役割を担うことになっている）

これと類似したものとして[DataView](https://qiita.com/toshi00ysm/items/09404faf4c6c3921c800)というのがあるが、こちらは「開発者側がバイナリのエンディアンを意識しながら触る必要がある」とかでもない限り使うことは稀で、だいたい型付き配列（typed array）の方を使う。

## 用途
- （自身には読み書き機能を持たない）[ArrayBuffer](https://qiita.com/toshi00ysm/items/ddd60c22aa58d16c8320)に対して、データの読み書きを行う
- [ArrayBuffer](https://qiita.com/toshi00ysm/items/ddd60c22aa58d16c8320)内のデータに対して、`.forEach()`, `.map()`, `.length`など`Array`ライクな操作を行う
  - ちなみに、`.push()`とか`.pop()`とか（一部Arrayにあるのに）ないやつもある。まぁあったところで、存在意義が謎なので「ぁ確かに」という感じ。

なお後述の通り、typed arrayにはいくつかの種類があるが、  
それら違い（用途の使い分け）は**そのバイナリ（[ArrayBuffer](https://qiita.com/toshi00ysm/items/ddd60c22aa58d16c8320)の中身）をどう解釈するか**（i.e. そのバイナリのデータ単位が何バイトなのか、符号（±）はあり/なしか）であり、  
「どう解釈すべきか」の答えは以下の順で探せばだいたい見つかると思われる
1. そのバイナリの生成側の仕様（書）
2. （もし1.がないなら）生成するコードを書いた人の脳内
3. 上記関係なく（ハック的な意味も含み）、あなたがそのバイナリをどう読み（解釈し）たいか

## typed arrayの種類
typed arrayには後述の表にまとめたとおり、いくつかの種類がある。  

これらはその名前からどんなものか判別可能になっている
```
<[Int|Uint|Float]><バイト数>Array
```
- 数値の種類
  - Int: 符号あり（±）整数
    - 64ビットのときだけ"BigInt"
  - Uint: 符号なし（+のみ）整数
    - 64ビットのときだけ"BigUint"
  - Float: 浮動小数点
- バイト数（8 〜 64バイト）
- "Array": そのまま。「（〜な）配列」ってこと。
  - 8ビットにだけ、別途"**Clamped**Array"というのがいる。後述の表の備考欄を参照のこと。

| 型 | ± / +のみ |  Int / Float | 数値のビット長（バイト長） | 値の範囲 | 備考 |
|--|--|--|--|--|--|
| [Int8Array](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Int8Array) | ± | Int | 8ビット（1バイト） | -128 ～ 127 |  |
| [Uint8Array](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array) | +のみ | Int | 8ビット（1バイト） | 0 ～ 255 |  |
| [Uint8ClampedArray](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Uint8ClampedArray) | +のみ | Int | 8ビット（1バイト） | 0 ～ 255 | 設定しようとした値が `0 〜 255` の範囲外だった場合、 0 または 255 が代わりに設定される（最小値0, 最大値255でキャップされる; Uint8Arrayの場合は、上位桁に繰り上がる） |
| [Int16Array](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Int16Array) | ± | Int | 16ビット（2バイト） | -32768 ～ 32767 |  |
| [Uint16Array](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Uint16Array) | +のみ | Int | 16ビット（2バイト） | 0 ～ 65535 |  |
| [Int32Array](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Int32Array) | ± | Int | 32ビット（4バイト） | -2147483648 ～ 2147483647 |  |
| [Uint32Array](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Uint32Array) | +のみ | Int | 32ビット（4バイト） | 0 ～ 4294967295 |  |
| [Float32Array](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Float32Array) | ± | Float | 32ビット（4バイト） | 1.2×10<sup>-38</sup> ～ 3.4×10<sup>38</sup> |  |
| [BigInt64Array](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/BigInt64Array) | ± | Int | 64ビット（8バイト） | 5.0×10<sup>-324</sup> ～ 1.8×10<sup>308</sup> |  |
| [BigUint64Array](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/BigUint64Array) | +のみ | Int | 64ビット（8バイト） | -2<sup>63</sup> ～ 2<sup>63</sup>-1 |  |
| [Float64Array](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Float64Array) | ± | Float | 64ビット（8バイト） | 0 ～ 2<sup>64</sup>-1 |  |

## 参照
- [JavaScript 型付き配列 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Typed_arrays)
- [TypedArray - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/TypedArray)
- [Typed Arrays: ブラウザでバイナリデータを扱う - HTML5 Rocks](https://www.html5rocks.com/ja/tutorials/webgl/typed_arrays/)