Help us understand the problem. What is going on with this article?

Array、運命の操作

はじめに

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 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away