2010-03-04 6 views
7

In Javascript, einer der reliable ways to convert a string to a number ist der Number Konstruktor:Was ist der Unterschied zwischen "neue Nummer (...)" und "Nummer (...)" in JavaScript?

var x = Number('09'); // 9, because it defaults to decimal 

von this question inspiriert, begann ich — fragen, was der Unterschied zwischen dem oben und:

var x =new Number('09'); 

Number sicherlich sieht besser aus, aber es scheint wie eine leicht unpassende Verwendung eines Konstruktors. Gibt es irgendwelche Nebenwirkungen oder einen Unterschied zur Verwendung ohne die neue? Wenn es keinen Unterschied gibt, warum nicht, und was ist der Zweck von neuen?

Antwort

10

Im ersten Fall verwenden Sie die Number Constructor Called as a Function, wie in der Spezifikation beschrieben, die einfach eine Typumwandlung durchführen wird, können Sie eine Number primitive zurück.

Im zweiten Fall, verwenden Sie die Number Constructor ein Number Objekt zu machen:

var x = Number('09'); 
typeof x; // 'number' 

var x = new Number('09'); 
typeof x; // 'object' 

Number('1') === new Number('1'); // false 

Der Unterschied kann subtil sein, aber ich denke, es ist wichtig, zu bemerken, wie Wrapper-Objekte wirken auf primitive Werte.

+1

Um fair zu sein, 'neue Nummer ('1') === neue Nummer ('1')' ist auch 'falsch', aber ich stimme dir sonst zu :) –

+1

Richtig, denn das wird zwei verschiedene Objekte vergleichen Verweise. – CMS

+0

@Richard Szalay - aber, 'Nummer ('1') === Nummer ('1')' ist 'wahr', was den @ CMS-Punkt darstellt. – Nicole

0

Spidermonkey-1.7.0:

js> typeof new Number('09'); 
object 
js> typeof Number('09'); 
number 
4

Number gibt einen primitiven Zahlenwert zurück. Ja, es ist ein bisschen merkwürdig, dass man eine Konstruktorfunktion auch als einfache Funktion verwenden kann, aber so ist JavaScript definiert. Die meisten integrierten Sprachtypen haben seltsame und inkonsistente zusätzliche Funktionen wie diese.

new Number erstellt ein explizites Boxed Number Objekt. Der Unterschied:

typeof Number(1)  // number 
typeof new Number(1) // object 

Im Gegensatz zu Java boxed primitiven Klassen, in JavaScript expliziten Number Objekten sind von absolut keine Verwendung.

Ich würde mich nicht mit der Verwendung von Number beschäftigen. Wenn Sie explizit sein möchten, verwenden Sie parseFloat('09'); Wenn Sie kurz sein wollen, verwenden Sie +'09'; Wenn Sie nur Ganzzahlen zulassen möchten, verwenden Sie parseInt('09', 10).

+0

+1, wünschte, ich könnte zwei Antworten als richtig akzeptieren, da beide völlig korrekt sind und einzigartige hilfreiche Informationen enthalten. Ich wusste nicht, wie man '+' ohne vorangestellte Nummer benutzt. – Nicole

0

Nummer (ohne neu) scheint nicht genau in einem primitiven Ergebnis zu resultieren. Im folgenden Beispiel wird anyMethod() aufgerufen (falls im Number-Prototyp).

Number(3).anyMethod() 

Während

3.anyMethod() 

wird nicht funktionieren.

Verwandte Themen