はじめに
JavaScriptにはプリミティブ型とオブジェクト型があります。
Primitive (プリミティブ) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN
JavaScript において、プリミティブ (primitive、プリミティブ値、プリミティブデータ型) はオブジェクトでなく、メソッドを持たないデータのことです。 7 種類のプリミティブデータ型があります。文字列、数値、真偽値、null、undefined、そしてシンボル (ECMAScript 2016 で追加) です。
つまり、普段よく使う文字列や数値などは「プリミティブ」、配列などは「オブジェクト」に分類されるということです。
プリミティブ型とオブジェクト型で大きな違いがあり、それは条件式で比較したときにこのようになる点です。
// プリミティブ型の比較
a = 5;
b = 5;
console.log(a == b); // true
// オブジェクト型の比較
a = [5, 10];
b = [5, 10];
console.log(a == b); // false
プリミティブ型では値同士を比較することが可能ですが、オブジェクト型の場合はそれができません。
今回はそのオブジェクト型である配列に関する内容です。
Uint16Array(符号なし整数の配列)
突然ですが、JavaScriptには様々な種類の配列があります。
JavaScript リファレンス - JavaScript | MDN
索引付きコレクション
これらのオブジェクトは、インデックス値で順序付けされたデータのコレクションを表します。これには、(型付けされた) 配列や配列に似た構造体も含まれます。
Arrayはよく使われると思いますが、Uint16Arrayなどあえて型付けされる配列も用意されています。
a = new Uint16Array([10, '20', -5, 65540]);
console.log(a); // Uint16Array [ 10, 20, 65531, 4 ]
UintというのはUnsigned integerの略で、符号なし整数と言われます。
Uint16の場合は符号なし整数のうち、2の16乗の数を扱えるということになり、0〜65535(=2の16乗から1引いたもの)まで利用できます。
-5は2の補数表現 1 に従うので65531になり、65540は2進数にしたときに16ビットからあふれるものがあるので、それを無視するんだと思います。
ArrayとUint16Array
自分がなにを思い立ったかわかりませんが、こんなことをしてみました。
a = new Uint16Array([10, 20]);
b = new Array(10, 20);
console.log(JSON.stringify(a)); // {"0":10,"1":20}
console.log(JSON.stringify(b)); // [10,20]
JSON文字列にするというただそれだけなのですが、同じ Array
を名乗っているにもかかわらず、微妙に違うようです。
自分の知識不足でこれ以上深追いできませんが、個人的に小さな闇だと思いました...
JSON.stringify
の挙動についてもうすこし調べてみました。続きはこちらで!
続・Array、運命の操作(2019/12/08追記)
-
この記事がとてもわかりやすいです。https://qiita.com/YamadaTakahito/items/79693ce08cad8baf130b ↩