LoginSignup
3
4

More than 3 years have passed since last update.

Array、運命の操作

Last updated at Posted at 2019-12-05

はじめに

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追記)


  1. この記事がとてもわかりやすいです。https://qiita.com/YamadaTakahito/items/79693ce08cad8baf130b 

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4