Primitive (プリミティブ)
JavaScript において、プリミティブ (primitive、プリミティブ値、プリミティブデータ型) はオブジェクトでなく、メソッドを持たないデータのことです。 6 種類のプリミティブデータ型があります。文字列、数値、BigInt、真偽値、undefined、そしてシンボル (ECMAScript 2016 で追加) です。また、プリミティブに見える null もありますが、実際にはすべての Object
の特殊なケースです。そして、構造化された型はすべてプロトタイプチェーンによって null
から派生しています。
多くの場合、プリミティブ値は、その言語実装の最下層にて直接的に表現されます。
すべてのプリミティブ値は、イミュータブル (immutable) 、つまり変更できません。変数には新しい値を再割り当てすることができますが、既存の値については、オブジェクト、配列、関数が変更できるのに対して、プリミティブ値は変更することができません。
例
この例は、プリミティブ値が変更不可である事実を理解するために役立つでしょう。
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
識別子の値を探します。最初の文で確立された変数が見つかります。- 見つかったら、式が評価されて
foo
が 5 で置き換えられ、 JavaScript エンジンはその値を関数に引数として渡します。 - 関数本体の中の文を実行する前に、 JavaScript は渡された引数のコピーを取り (すなわちプリミティブ値)、ローカルのコピーを生成します。これらのコピーは、関数のスコープの中でしか存在せず、関数定義の中で指定された識別子でアクセスすることができます (
addTwo
ではnum
、addTwo_v2
ではfoo
) - それから関数内の文が実行されます。
- 最初の関数では、ローカル変数
num
が生成されます。この値を 2 つ増加させますが、元のfoo
の値ではありません。 - 二番目の関数では、ローカル変数
foo
が生成されます。この値を 2 つ増加させますが、元の (外部の)foo
の値ではありません。このような場合、外部変数foo
は直接アクセスすることができません。これは JavaScript の語彙スコープであり、結果的に変数を見えなくするためです。ローカルのfoo
が外側のfoo
を隠します。詳しくは、クロージャーをご覧ください。 (なお、window.foo
を使用して外部変数foo
へアクセスすることができます。)
- 最初の関数では、ローカル変数
- 結果として、関数内で変更を行ってもコピーに対して作業をすることになるので、元の
foo
にはまったく影響しません。
これが、プリミティブ値が変更不可である理由です - 直接作業するのではなく、元の値に影響せずにコピーで作業しています。
JavaScript のプリミティブラッパーオブジェクト
詳細情報
基礎知識
- JavaScript のデータ構造
- Wikipedia の プリミティブ型 の記事