28 Stimmen

Warum haben Zahlenliterale keinen Zugriff auf Number-Methoden?

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?

38voto

Nick Craver Punkte 609016

Du kannst es auf die gleiche Weise zugreifen, es handelt sich hier um ein anderes Analyseproblem. Verwende dazu eine leicht abweichende Syntax:

(1).toString()

Zahlen können Dezimalstellen haben, daher ist die Syntax für das Enden mit einer Dezimalstelle etwas mehrdeutig, wenn du den Code analysierst. Verwende Klammern, um gültig zu sein. Es wird etwas klarer, wenn du siehst, dass dies auch gültig ist:

(1.).toString()

Allerdings scheitert es nur mit 1.toString() beim Versuch, es als eine Zahl mit einer Dezimalstelle zu analysieren.

8voto

awayken Punkte 455

Ich denke, dass Sie eine Antwort auf Ihre Frage in dieser Antwort auf eine andere Stack Overflow Frage finden werden. Um Theos Antwort zusammenzufassen:

[D]er Parser erwartet, dass eine Nummer gefolgt von einem Punkt eine Gleitkommaliteral ist. [...] [S]ie müssen nur einen anderen Punkt hinzufügen, damit es funktioniert[.]

0voto

AutoSponge Punkte 1446

Null (großes N) ist ein Variablenname. Reservierte Wörter sind Groß- und Kleinschreibung beachten. null ist das Objekt null. typeof null === "object" //true

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X