JavaScriptのデータ型について

JavaScriptのデータタイプは、大きく分けて「プリミティブ型」と「オブジェクト型」の2種類があります。

プリミティブ型

プリミティブ型は、値そのものを保持するデータ型であり、メモリに格納された値は変更できません(イミュータブルの特性を持つ)。

string(文字列)

文字の集合を表すデータ型。

let name = "JavaScript";

number(数値)

整数や浮動小数点数を表すデータ型。

let boxWidth = 25;
let boxHeight = 12.99;

bigint(大きな整数)

Number型の範囲を超える大きな整数を扱うためのデータ型。

let bigNumber = 123456789012345678901234567890n;

boolean(真偽値)

true または false の2つの値を持つデータ型。

let isOpen = true;

undefined(未定義)

値が未定義の状態。

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

null(ヌル)

意図的に「値がない」ことを示す特殊なデータ型。

let empty = null;

symbol(シンボル)

一意の識別子を作成するためのデータ型。

let uniqueId = Symbol("id");

オブジェクト型(Object Type)

オブジェクト型は、複数の値を格納し、プロパティやメソッドを持つことができます。メモリに格納された値を直接変更可能です(ミュータブルの特性を持つ)。

Object(オブジェクト)

キーと値のペアを持つデータ構造。

let person = {
  name: "Jessica",
  age: 30
};

Array(配列)

複数の値を順序付きで格納できるオブジェクト。

let numbers = [1, 2, 3, 4, 5];

Function(関数)

関数もオブジェクトの一種で、実行可能なコードの塊。

function greet() {
  return "Hello!";
}

Date(日付)

日時を扱うためのオブジェクト。

let today = new Date();

RegExp(正規表現)

パターンマッチングを行うためのオブジェクト。

let pattern = /hello/;

Map / Set

Map:キーと値のペアを持つコレクション
Set:一意の値のみを持つコレクション

let map = new Map();
map.set("key", "value");

let set = new Set([1, 2, 3, 3]);

データ型を調べる演算子「typeof」

typeof を使うと変数のデータ型を確認することができます。

console.log(typeof 42);        // "number"
console.log(typeof "Hello");   // "string"
console.log(typeof true);      // "boolean"
console.log(typeof undefined); // "undefined"
console.log(typeof null);      // "object"(※JavaScriptの仕様上のバグ)
console.log(typeof {});        // "object"
console.log(typeof Symbol());  // "symbol"

※ typeof null が "object" になるのは、JavaScriptの設計上の誤り。

イミュータブルな変数とミュータブルな変数

イミュータブルな変数

変数は宣言されると初期値がメモリ内の特定のアドレスに格納されます。変数という箱に「値」が入っているのではなく、値を参照するための「アドレス」が入っていると考えると分かりやすいです。イミュータブルな変数の場合、値を変更すると元の値は変更されず、別のアドレスに値が格納されます。そして変数には新しい「アドレス」が入ります。

例えば、変数nameの初期値「John」が住所200番地からのメモリに格納されているとすると、変数nameに「Paul」を代入した場合、今度は住所300番地からのメモリに格納されるといったイメージです。

イミュータブルな変数の値を変更しても、既に格納された値に上書きされるのではなく、別のアドレスに新たな値が格納されます。変数の値を変更しても元の値がメモリにそのまま残っているため「immutable(不変)」と呼ばれています。

※「不変」と言っても実際には、ガベージコレクションという仕組みにより、古い値は最終的にはメモリから自動的に開放されます。

ミュータブルな変数

ミュータブルな変数の場合、値を変更すると、同じアドレス内の値が変更されます。例えば、配列の要素を変更したり、オブジェクトのプロパティを変更したりすると、メモリ空間上の元の配列やオブジェクトが直接変更されます。

リテラル

リテラル(literal) とは、ソースコード内に直接記述される値のことです。変数や定数に値を代入する際に、具体的な値を直接記述するために使用されます。

// 文字列リテラル
let message = 'Hello, world!';

// 数値リテラル
let age = 30;
let pi = 3.14;

// 真偽値リテラル
let isTrue = true;

// オブジェクトリテラル
let person = { name: 'John', age: 30 };

// 配列リテラル
let numbers = [1, 2, 3, 4, 5];

数値リテラル(Number Literal)

数値を表すリテラルです。

42       // 整数
3.14     // 小数(浮動小数点数)
0b1010   // 2進数(binary)
0o52     // 8進数(octal)
0x1A     // 16進数(hexadecimal)
1.2e3    // 指数表記(1.2 × 10³ = 1200)

文字列リテラル(String Literal)

文字列を表すリテラルです。シングルクォート(’)・ダブルクォート(”)・バッククォート(`) の3種類があります。

"Hello"    // ダブルクォート
'World'    // シングルクォート
`Hello ${name}`  // テンプレートリテラル(埋め込み可能)

シングルクオートで囲まれた文字列の中にシングルクオートをテキストとして含める場合は以下のようにエスケープシーケンス「\(バックスラッシュ)」を利用します。

document.write('I\'m sleepy.'); // "I'm sleepy."

JavaScriptのエスケープシーケンス一覧

ES説明
\0NULL文字バイナリデータ処理、文字列終端テスト
\bバックスペース正規表現の単語境界 (\b)、一部の端末での削除
\t水平タブ整列のためのスペース挿入
\nニューライン(改行)UNIX系の改行、ログ出力
\v垂直タブほぼ使用されないが、一部の環境で改行として機能
\fフォームフィールド(改ページ)プリンターの改ページを指示する制御文字
\rキャリッジリターン(復帰)Windowsの改行(\r\n)、コンソール書換
\’シングルクォート (‘)文字列リテラル内で ' を含める
\”ダブルクォート (“)文字列リテラル内で " を含める
\\バックスラッシュ (\)バックスラッシュをエスケープするため
\uUnicode文字コード“\u3042″→[あ]
\x英数文字コード“\x41″→[A]
※「ES」はエスケープシーケンスの略

ブール値リテラル(Boolean Literal)

真偽値(true / false)を表すリテラルです。

true   // 真
false  // 偽

null リテラル

nullは「値が存在しないことを明示する特殊なリテラル」です。

let empty = null;

undefined リテラル

undefined は 「値が未定義であることを示すリテラル」 です。

let value = undefined; // 明示的に undefined を代入

オブジェクトリテラル(Object Literal)

オブジェクトを直接作成するリテラルです。

let person = {
  name: "Jessica",
  age: 25,
  isStudent: false
};

配列リテラル(Array Literal)

配列を作成するためのリテラルです。

let numbers = [1, 2, 3, 4, 5];
let mixedArray = ["apple", 56, true, null];

正規表現リテラル(RegExp Literal)

正規表現を直接作成するリテラルです。

let regex = /hello/i; // "hello" という単語を大文字小文字区別なく検索

BigInt リテラル

大きな整数を扱うためのリテラルです。末尾に n をつける ことで BigInt になります。

let bigNumber = 123456789012345678901234567890n;

シンボルリテラル(Symbol Literal)

ユニークな識別子を作成するためのリテラルです。

let uniqueKey = Symbol("key");