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にも影響します。

基本型(プリミティブ型)と参照型(オブジェクト型)では こうした違いがあることを押えておいてください。