プリミティブ (primitive、プリミティブ値、プリミティブデータ型) は、オブジェクトでなく、メソッドを持たないデータのことです。JavaScript には 6 個のプリミティブデータ型があります。文字列数値真偽値nullundefined、そしてシンボルです (ECMAScript 2015 で追加)。

多くの場合、プリミティブ値は、その言語実装の最下層にて直接的に表現されます。

すべてのプリミティブ値は、イミュータブル (immutable) 、つまり変更できません。変数には新しい値を再割り当てすることができますが、既存の値については、オブジェクト、配列、関数が変更できるのに対して、プリミティブ値は変更することができません。

Example

この例は、プリミティブ値が変更不可である事実を理解するために役立つでしょう。

JavaScript

// 文字列のメソッドを使用しても文字列は変更されない
var bar = "baz";
console.log(bar);               // baz
bar.toUpperCase();
console.log(bar);               // baz

// 配列のメソッドを使用すると配列が変更される
var foo = [];
console.log(foo);               // []
foo.push("plugh");
console.log(foo);               // ["plugh"]

// プリミティブ値を代入することで新しい (変更されたわけではない) 値になる
bar = bar.toUpperCase();       // BAZ

プリミティブ値は置き換えることができますが、直接変更することはできません。

他の例 [ 手順を追って ]

以下の例は JavaScript がプリミティブ値をどのように扱うかを概観するのに役立つでしょう。

JavaScript

// プリミティブ値
let foo = 5;

// プリミティブ値を変更する関数を定義
function addTwo(num) {
   num += 2;
}
// 同じことをしようとする第二の関数
function addTwo_v2(foo) {
   foo += 2;
}

// 最初の関数を、プリミティブ値を引数として呼び出す
addTwo(foo);
// 現在のプリミティブ値を取得
console.log(foo);   // 5

// 第二の関数を呼び出してみる...
addTwo_v2(foo);
console.log(foo);   // 5

5 ではなく 7 になると思いませんでしたか?そう思った場合は、このコードがどのように実行されるかを見てください。

  • addTwo および addTwo_v2 の両関数の呼び出しにおいて、 JavaScript は foo 識別子の値を探します。最初の文で確立された変数が見つかります。
  • 見つかったら、 JavaScript は関数に引数としてその値を渡します。
  • 関数本体の中の文を実行する前に、 JavaScript は渡された引数のコピーを取り (すなわちプリミティブ値)、ローカルのコピーを生成します。これらのコピーは、関数のスコープの中でしか存在せず、関数定義の中で指定された識別子でアクセスすることができます (addTwo では numaddTwo_v2 では foo)
  • それから関数内の文が実行されます。
    • 最初の関数では、ローカル変数 num が生成されます。この値を2つ増加させますが、元の foo の値ではありません。
    • 二番目の関数では、ローカル変数 foo が生成されます。この値を2つ増加させますが、元の (外部の) foo の値ではありません。このような場合、外部変数 fooどのような方法でもアクセスすることができません。これは JavaScript の語彙スコープであり、結果的に変数を見えなくするためです。ローカルの foo が外側の foo を隠します。詳しくは、クロージャーをご覧ください。
  • 結果として、関数内で変更を行ってもコピーに対して作業をすることになるので、元の foo にはまったく影響しません

これがプリミティブ値が変更不可である理由です。元のものに触れることなく、プリミティブ値のコピーに対して作業を行います。

JavaScript のプリミティブラッパーオブジェクト

nullundefined を除くすべてのプリミティブ値には、そのプリミティブ値を内包する等価のラッパーオブジェクトがあります。

ラッパーの valueOf() メソッドは、そのプリミティブ値を返します。

詳細情報

基礎知識

ドキュメントのタグと貢献者

このページの貢献者: j-horiba, mfuji09, c-yan, Uemmra3, Marsf, tac_yacht, x2357
最終更新者: j-horiba,