JavaScript - 基本型(プリミティブ型)と参照型(オブジェクト型)の違い
JavaScript のデータ型は、大きく2つに分けて 「基本型(プリミティブ型)」と「参照型(オブジェクト型)」があります。
違いは変数に値を格納する方法です。
基本型(プリミティブ型)は値を直接変数に格納します。
一方、参照型(オブジェクト型)は値を格納している場所(メモリ上のアドレス)を 格納します。
それぞれの型を具体的に見ていきましょう。
基本型(プリミティブ型)のデータ型
基本型(プリミティブ型)は具体的には次のようなデータ型があります。
- 文字列型 (string)
- 数値型 (number)
- 真偽型 (boolean)
- 特殊型 (null, undefined)
- シンボル (symbol)
シンボルはES2015で新しく追加されたデータ型です。
参照型(オブジェクト型)のデータ型
「基本型(プリミティブ型)以外」のデータ型は参照型(オブジェクト型)になります。
具体的には次のようなデータ型があります。
- オブジェクト (object)
- 配列 (array)
- 関数 (function)
- 正規表現 (regular expression)
基本型(プリミティブ型)と参照型(オブジェクト型)の違い
基本型(プリミティブ型)での動作
次のサンプルコードを見てください。
変数 a と変数 b の最終的な値が異なることが確認できます。
var a = 1;
var b = a;
a = 0;
console.log(a); // 0
console.log(b); // 1
変数 a と変数 b はそれぞれ直接値が代入されます。
ですから変数 a の値を「a = 0」と変更しても、 変数 b には何の影響もありません。
これが参照型(オブジェクト型)だと動作が異なってきます。
参照型(オブジェクト型)での動作
次のサンプルコードを見てください。
配列 arr1 と配列 arr2 の出力結果が同じになっています。
var arr1 = [1, 2, 3];
var arr2 = arr1;
arr1[0] = 0;
console.log(arr1); // Array [ 0, 2, 3 ]
console.log(arr2); // Array [ 0, 2, 3 ]
これが参照型(オブジェクト型)の特徴です。
「var arr2 = arr1;」とした時点で、 配列 arr2 には[1, 2, 3]ではなく、 配列 arr1 が参照しているメモリ上のアドレスが格納されます。
つまり配列 arr1 と配列 arr2 には同じメモリ上のアドレスが格納されています。
ですから、「arr1[0] = 0;」という変更は、配列 arr2 にも影響します。
同じように、配列 arr2 を通してのデータ変更は、配列 arr 1にも影響します。
基本型(プリミティブ型)と参照型(オブジェクト型)では こうした違いがあることを押えておいてください。