Wenn Sie die ECMAScript 3-Spezifikation betrachten, werden Sie feststellen, dass die primitiven Werttypen Null und Undefined keine entsprechenden Null- und Undefined-Objekte haben.
>> Null
ReferenceError: Null is not defined
Die anderen primitiven Werttypen Number, String und Boolean haben jedoch entsprechende Number, String und Boolean-Objekte, auf die Sie aus dem globalen Scope zugreifen können.
>>Number
function Number() { [native code] }
>>Boolean
function Boolean() { [native code] }
Der Zweck dieser primitiven Werttypen besteht darin, Methoden wie toString
und valueOf
für ihre jeweiligen primitiven Werttypen bereitzustellen:
>>var n = 1;
>>n.toString();
"1"
ist das gleiche wie
>>var n = 1;
>>Number.prototype.toString.call(n);
"1"
Booleans und Strings funktionieren auf die gleiche Weise:
>>var b = true;
>>b.toString();
"true"
>>Boolean.prototype.toString.call(b);
"true"
Sie können sehen, dass die primitiven Wertobjekte die Methoden ihres entsprechenden Objekts verwenden, wenn Sie versuchen, Typen zu mischen:
>>Boolean.prototype.toString.call(n);
TypeError: Boolean.prototype.toString is not generic
>>Number.prototype.toString.call(b)
TypeError: Number.prototype.toString is not generic
Interessanterweise können Sie für boolesche und zeichenfolgenliterale Typen diese Methoden direkt aus dem Literal aufrufen:
>>true.toString();
"true"
>>Boolean.prototype.toString.call(true)
"true"
>>"moo".toString();
"moo"
>>String.prototype.toString.call("moo")
"moo"
Primitiven Werten null und undefined können diese Dinge nicht tun, da ihnen keine entsprechenden Null- und Undefined-Objekte zugeordnet sind:
>>Null
ReferenceError: Null is not defined
>>null.toString()
TypeError: Cannot call method 'toString' of null
Der primitive Werttyp number verhält sich wie eine Mischung aus beiden. Sie können toString
für ein Literal aufrufen, wenn Sie direkt die Methode des Number-Prototypobjekts verwenden:
>>Number.prototype.toString.call(1);
"1"
Aber Sie können nicht auf die Methode direkt vom Literal aus zugreifen, wie Sie es bei Zeichenfolgen und Booleschen Werten können:
>>1.toString()
SyntaxError: Unexpected token ILLEGAL
Warum verhalten sich Nummernliterale anders als Boolesche und Zeichenfolgen, obwohl es ein Number-Objekt gibt?