あらゆるプログラミング言語には、それぞれの言語によって異なったデータ構造が存在します。コードを書くうえで、それらのデータの構造を理解することは必要不可欠です。

今回は、JavaScriptで扱うデータ型の一つ、プリミティブ型の性質について解説します。

プリミティブ型

プリミティブ型は、値そのものを管理する不変のデータ型で、変更できない値を持っていることが定義付けられています。
数値であれば10という値、文字列であれば'Hello'という値などが該当します。オブジェクト型であれば値を変更することができますが、プリミティブ型は既存の値をこれ以上変更することができません。

プリミティブ型の種類は、以下の通りです。

  • 数値(Number)
  • 文字列(String)
  • 長整数(BigInt)
  • 論理値(Boolean)
  • null
  • undefined
  • シンボル(Symbol)

一つずつ見ていきましょう。

数値(Number)

プログラミングにおける数値は、10210などの整数と、8.510.21などの小数に分類され、さらに値を表現するためにビット数などが使われます。

「整数」「小数」「ビット数」によって数値の型を区別するプログラミング言語もありますが、JavaScriptにおける数値の型は、「IEEE754倍精度浮動小数点数(64ビット)」と1種類のみです。
つまり、JavaScriptの数値は小数で表されるということです。

サンプルコードを見てください。

const a = 10; 
const b = 20; 

console.log(a + b); // 30

単純計算では30という出力結果が出ます。しかし、これは表示の問題であり、内部では30.0という結果になっているのです。

では、以下ではどのような計算結果となるでしょうか。

const a = 0.1; 
const b = 0.2; 

console.log(a + b); // 0.30000000000000004

JavaScriptでは0.30000000000000004という結果になります。これには、64ビットの範囲内で小数を表現するための、IEEE754倍精度浮動小数点数という表現規格が関係しているからです。
数値には、コンピューターで表現できるものとそうでないもの(πなど)が存在し、数値の精度にも限りがあります。そのため、近似値に当てはめて計算を行い、このような結果が出るのです。

文字列(String)

文字列は、連続した文字の集まりのことです。「’シングルクォーテーション’」または、「”ダブルクォーテーション”」で文字を囲うことで、テキスト文字として表示させることができます。

const greeting = 'Hello';
console.log(greeting); // "Hello"

長整数(BigInt)

長整数は、任意の精度の整数を扱います。JavaScriptの数値型では使えない大きな整数値を扱うことができます。

const bitint = 9007199254740992n;
console.log(bigint); // 9007199254740992n

論理値(Boolean)

論理値は、true(真)またはfalse(偽)の値を取ります。if文やfor文など、JavaScriptのさまざまな場面で使われます。

const a = 3; 

console.log(a < 5); // true
console.log(a === 0); // false

nullとundefined

nullとundefinedは、どちらも値が存在していないことを表します。
nullは、変数にnullを代入して意図的に値がないことを示すときに使用できます。undefinedは、値が代入される前の状態(値が代入されていない)です。それぞれnullまたはundefinedを返します。

let a = null; 
console.log(a); // null

let b; 
console.log(b); // undefined

シンボル(Symbol)

シンボルは、ES6から導入された比較的新しいデータ型で、唯一無二のユニークな値を持ちます。作成するたびにまったく新しいシンボルが生成されることが特徴的です。シンボルのデータ型は、typeof演算子を使用するとsymbolを返します。

let sym1 = Symbol('シンボル1です'); 
let sym2 = Symbol('シンボル2です'); 

console.log(typeof(sym1)); // "symbol"
console.log(typeof(sym2)); // "symbol"

ユニークな値を生成する例を見てみましょう。

let sym3 = Symbol(); 
let sym4 = Symbol(); 

console.log(sym3 === sym4); // false

結果の通り、Symbol()の中身が同じであっても、必ず別の値が生成されるため、他の値と被っていないか気にする必要がありません。

現状、シンボルを使用したプログラムを見る機会は多くはありませんが、衝突を避けるためにオブジェクトのプロパティーのキーとして利用されることがあります。

まとめ

今回はJavaScriptのデータ型の一つであるプリミティブ型について解説しました。
プリミティブ型は、変数自体の中に値そのものを保持し、これ以上値を変更することのできない不変な値を持つことが特徴です。
まずは基本の型として理解を深めていきましょう。

合わせて読みたいデータ型入門シリーズ

第1回:データ型とtypeof演算子
第2回:データ型 -プリミティブ(当記事)
第3回:データ型 -オブジェクト
第4回:文字列型(String)
第5回:数値型(Number)
第6回:論理型(Boolean)
第7回:null型・undefined型