var value = "String Literal";
var length = value.length;
alert(length);

var value2 = "String Literal";
value2.property = 12345;
alert(value2.property);

Number, String, Boolean の 3 つの型には、
プリミティブとオブジェクトの両方の型が存在する。
違いは、プロパティを持てるか持てないかだ。

暗黙の型変換が、色々な場所で適応されるため、
各型に対応するプリミティブ値とオブジェクトは、
ほぼ区別することなく透過的に扱うことができる。

また、JavaScript のプロパティアクセサ構文は
プリミティブ値に対しても記述することができるため、
構文上、プリミティブ値にプロパティがあるように見える。

これらの言語機能は強力なのだが、プリミティブ値とオブジェクトが、
単一の同じ型であるという誤解を生む原因ともなっている。

例えば、上記のコードは実行時エラーとはならず、14, undefined と表示される。
2 回目に表示される値は 12345 ではない。

プロパティアクセサにも、暗黙の型変換が存在する。
プロパティはオブジェクトが持つものなので、
プロパティアクセサの左辺値がプリミティブ値の場合は、
一時的に対応するオブジェクトに型変換され、
そのオブジェクトのプロパティとして評価される。

ポイントは、このオブジェクトは一時的であるということだ。
そのため、暗黙の変換で生成されたオブジェクトのプロパティに
値を代入しても、すぐにそのオブジェクトは消滅してしまう。

上記の例を分かりやすく書き換えると、以下のようになる。

var value = "String Literal";
var length = new String(value).length;
alert(length);

var value2 = "String Literal";
new String(value2).property = 12345;
alert(new String(value2).property);

こう書けば、下の property プロパティへの代入が、
一時的なオブジェクトに対するものであることは明確である。