ECMAScript 3 仕様を見ると、プリミティブ値型 Null および Undefined には Null オブジェクトと Undefined オブジェクトが付随しないことがわかります。
>> Null
ReferenceError: Null is not defined
その他のプリミティブ値型である Number、String、Boolean 型には、グローバル スコープから参照できる Number、String、Boolean オブジェクトが付随します。
>>Number
function Number() { [native code] }
>>Boolean
function Boolean() { [native code] }
これらのプリミティブ値型の目的は、それぞれのプリミティブ値型に対してtoString
やなどのメソッドを提供することです。valueOf
>>var n = 1;
>>n.toString();
"1"
と同じです
>>var n = 1;
>>Number.prototype.toString.call(n);
"1"
ブール値と文字列も同様に動作します:
>>var b = true;
>>b.toString();
"true"
>>Boolean.prototype.toString.call(b);
"true"
型を混在させようとすると、プリミティブ値オブジェクトが付随するオブジェクトのメソッドを使用していることがわかります。
>>Boolean.prototype.toString.call(n);
TypeError: Boolean.prototype.toString is not generic
>>Number.prototype.toString.call(b)
TypeError: Number.prototype.toString is not generic
興味深いことに、ブール値と文字列リテラル型の場合、これらのメソッドをリテラルから直接呼び出すことができます。
>>true.toString();
"true"
>>Boolean.prototype.toString.call(true)
"true"
>>"moo".toString();
"moo"
>>String.prototype.toString.call("moo")
"moo"
プリミティブ値の null および undefined は、付随する Null および Undefined オブジェクトがないため、次の操作を実行できません。
>>Null
ReferenceError: Null is not defined
>>null.toString()
TypeError: Cannot call method 'toString' of null
プリミティブ値型 number は、2 つの組み合わせのように動作します。NumbertoString
のプロトタイプ オブジェクトのメソッドを直接使用すると、リテラルを呼び出すことができます。
>>Number.prototype.toString.call(1);
"1"
ただし、文字列やブール値の場合のように、リテラル自体からメソッドにアクセスすることはできません。
>>1.toString()
SyntaxError: Unexpected token ILLEGAL
Number オブジェクトがあるにもかかわらず、数値リテラルの動作がブール値や文字列と異なるのはなぜですか?
ベストアンサー1
あなたできる同じ方法でアクセスしますが、ここでは解析の問題が異なります。これを行うには、少し異なる構文を使用します。
(1).toString()
数字には小数点が含まれることがあるため、小数点で終わる構文はコードを解析するときに少し曖昧になります。有効にするには括弧を使用します。これも有効であることがわかれば、少し明確になります。
(1.).toString()
1.toString()
しかし、数値として解析しようとしているだけだ小数点付き、そして失敗します。