JavaScript でプリミティブ値のプロパティを参照すると対応するオブジェクトが一時的に作られる
JavaScript では以下のように数値のプロパティを参照することはできません。
0.foo
// 構文エラー
変数に入れると構文上は正しいため参照できます。
var x = 0;
console.log(x.foo);
// => undefined
あるいは文字列の length
プロパティを参照することも。
"bar".length
// => 3
しかしながらプリミティブ値はオブジェクトではないため、プロパティもプロトタイプチェーンもありません。
ではプリミティブ値のプロパティにアクセスしようとしたときに何が起こるかというと、
Number
などの対応するオブジェクトが生成されます。
本記事は、この挙動が言語仕様のどの部分で言及されているのかのメモです。
プリミティブ値のプロパティ参照をするときの挙動
ECMAScript 2015言語仕様 6.2.3.1節 GetValue(V) の以下の部分です。
If HasPrimitiveBase(V) is true, then
Assert: In this case, base will never be null or undefined.
Let base be ToObject(base).
ということで言語仕様としてプリミティブ値のプロパティ参照はエラーじゃないと分かり安心しました。 夜もぐっすり眠れそうです(納期が近くなければ)。
ただし、ここで生成されたオブジェクトはその場限りのものなので、 プリミティブ値がオブジェクトのように扱えるわけではないことには注意が必要です。 具体的には以下のように数値のプロパティに対して代入をしたとしても、 その結果が残りません。
var x = 0;
x.foo = 1;
console.log(x.foo);
// => undefined