Was ist besser, Nummer (x) oder ParseFloat (x)?

146

Welches ist besser?

Ich bitte dies nur, um ein paar Bytes zu rasieren, da ich + x anstelle von Zahl (x) verwenden kann. Macht Parsefloat etwas besser?

Namanyay Goel
quelle
2
Gleitkommazahlen mit einfacher Genauigkeit belegen in einem 32-Bit-System 4 Bytes sowie einfache Ganzzahlen. Ich weiß nicht, wie Javascript mit Floats umgeht, aber ich denke, es ist ziemlich dasselbe.
Christian
5
@Christian: Alle Zahlen in Javascript sind Floats mit doppelter Genauigkeit.
Guffa
1
Ich hätte UP für diese Frage gestimmt, wenn es nicht das EDIT-Segment gegeben hätte
LaPuyaLoca

Antworten:

309

Der Unterschied zwischen parseFloat und Number

parseFloat/ parseIntdient zum Parsen einer Zeichenfolge, während Number/ +zum Erzwingen eines Werts zu einer Zahl dient. Sie verhalten sich anders. Aber schauen wir uns zuerst an, wo sie sich gleich verhalten:

parseFloat('3'); // => 3
Number('3'); // => 3
parseFloat('1.501'); // => 1.501
Number('1.501'); // => 1.501
parseFloat('1e10'); // => 10000000000
Number('1e10'); // => 10000000000

Solange Sie eine standardmäßige numerische Eingabe haben, gibt es keinen Unterschied. Wenn Ihre Eingabe jedoch mit einer Zahl beginnt und dann andere Zeichen enthält, wird parseFloatdie Zahl aus der Zeichenfolge abgeschnitten, während angegeben Numberwird NaN(keine Zahl):

parseFloat('1x'); // => 1
Number('1x'); // => NaN

Darüber hinaus Numberversteht hexadezimale Eingabe, während parseFloatnicht:

parseFloat('0x10'); // => 0
Number('0x10'); // => 16

Aber Numberwirkt seltsam mit leeren Zeichenfolgen oder Zeichenfolgen, die nur Leerzeichen enthalten:

parseFloat(''); // => NaN
Number(''); // => 0
parseFloat(' \r\n\t'); // => NaN
Number(' \r\n\t'); // => 0

Im Großen und Ganzen finde Numberich es vernünftiger, daher verwende ich es fast immer Numberpersönlich (und Sie werden feststellen, dass viele der internen JavaScript-Funktionen auch verwendet Numberwerden). Wenn jemand '1x'tippt, zeige ich lieber einen Fehler, als ihn so zu behandeln, als hätte er getippt '1'. Das einzige Mal, dass ich wirklich eine Ausnahme mache, ist, wenn ich einen Stil in eine Zahl konvertiere. In diesem Fall parseFloatist dies hilfreich, da Stile in einer Form vorliegen '3px'. In diesem Fall möchte ich das 'px'Teil löschen und nur das erhalten 3, sodass ich es parseFloathilfreich finde Hier. Aber es liegt wirklich an Ihnen, welche Sie wählen und welche Formen der Eingabe Sie akzeptieren möchten.

Beachten Sie, dass die Verwendung des unären +Operators genau der Verwendung Numberals Funktion entspricht:

Number('0x10'); // => 16
+'0x10'; // => 16
Number('10x'); // => NaN
+'10x'; // => NaN
Number('40'); // => 40
+'40'; // => 40

Also benutze ich normalerweise nur +kurz. Solange Sie wissen, was es tut, finde ich es leicht zu lesen.

Nathan Wall
quelle
2
Ich würde nicht berücksichtigen Leerzeichen => 0 Verhalten Number()als „seltsam“ Ich würde es sogar überlegen , da mehr erwartet, Leerzeichen ein leerer Wert ist , aber es ist nicht null / undefined => 0 ein schönes Ergebnis.
Groß
4
@ NathanWall: Könnte das erwähnen wollen, Number('Infinity') === InfinitywährendparseInt('Infinity') === NaN
sstur
3
Ich würde dafür kein +(unäres Plus) verwenden, denn wenn Sie ein Semikolon in der vorherigen Zeile vergessen, wird möglicherweise stattdessen ein Additionsausdruck ausgewertet.
Jackson
1
Für die Fälle, in denen sie sich gleich verhalten, habe ich herausgefunden, dass parseFloat von 1% bis 15% langsamer ist und langsamer wird, wenn die Anzahl der Dezimalstellen in einer Zeichenfolge zunimmt. Mit 1M in meinem System ist parseFloat ('1.501') 5% langsamer als Number ('1.501') und parseFloat ('1.50137585467') ist 15% langsamer als Number ('1.50137585467'). Also gehe ich zu Number ().
Bytepan
1
@ ChrisBrownie55 Wow, guter Fang. Ich wusste nicht, dass parseFloat das kann. Ich denke, Infinity ist keine ganze Zahl!
sstur
9

Der Unterschied besteht darin, was passiert, wenn die Eingabe keine "richtige Zahl" ist. Numberkehrt zurück, NaNwährend parseFloat"so viel wie möglich" analysiert wird. Bei Aufruf der leeren Zeichenfolge wird Numberzurückgegeben, 0während parseFloat zurückgegeben wird NaN.

Beispielsweise:

Number("") === 0               // also holds for false
isNaN(parseFloat("")) === true // and null

isNaN(Number("32f")) === true
parseFloat("32f") === 32
Jon
quelle
4
Beachten Sie, dass NaN != NaNobwohl
Wex
@Wex Oh du sagst, dass TRUENaN != NaN bewertet wird - danke für den Tipp!
jave.web
4
verwenden isNaN () zum Testen der NaN Wert, isNaN(NaN)kehrttrue
jave.web
5

In diesen Beispielen sehen Sie den Unterschied:

Number('') = 0;
Number(false) = 0;
Number('1a') = NaN;

parseFloat('') = NaN;
parseFloat(false) = NaN;
parseFloat('1a') = 1;

parseFloat ist etwas langsamer, da es nach dem ersten Auftreten einer Zahl in einer Zeichenfolge sucht, während der Zahlenkonstruktor eine neue Zahleninstanz aus Zeichenfolgen erstellt, die numerische Werte mit Leerzeichen oder falsche Werte enthalten.

PS Wenn Sie an universellen Lösungen zur Typkonvertierung interessiert sind, können Sie den Beitrag zur Typkonvertierung in meinem Blog lesen: http://justsimplejs.blogspot.com/2012/08/data-type-conversion.html

micnic
quelle
2

Bei leeren Zeichenfolgen sind sie unterschiedlich.

+""und Number("")gibt 0 zurück, während parseFloat("")NaN zurückgegeben wird.

xdazz
quelle
2
Ich würde so weit gehen zu sagen, dass parseFloat()das richtige Ergebnis erzielt wird, da eine leere Zeichenfolge NICHT die Zahl 0(gelesen: NaN) ist, während eine Zeichenfolge mit dem Zeichen "0"darin IST 0;
Christopher
+xGibt 0nicht nur für eine leere Zeichenfolge zurück, sondern auch für alle Nur-Leerzeichen-Zeichenfolgen. Beispiele: +" ", +"\t\t\t", +"\n\n"- alle von ihnen geben 0als Ergebnis
Lukasz Wiktor
2

Soweit ich weiß, und dies wird nur von Kollegen belauscht, so dass es möglicherweise völlig schlecht informiert ist, dass parseFloat geringfügig schneller ist.

Nach weiteren Recherchen scheint dieser Leistungsunterschied vom Browser abhängig zu sein.

http://jsperf.com/parseint-vs-parsefloat/6

Schauen Sie sich diese jsPerf-Ergebnisse an und rufen Sie an. (es enthält auch + x Tests)

Wie bereits erwähnt in @xdazz ‚s Antwort, +""und Number("")Rückkehr 0während parseFloat("")kehrt NaNso wieder würde ich mit parseFloat gehen, weil ein leerer String bedeutet nicht , die Zahl 0, nur eine Zeichenfolge mit dem Zeichen "0"in es bedeutet , 0;

Christopher
quelle
Hier ist ein ausführlicheres Testfischen für eine schnellere Konvertierungsmethode ... parseFloat()ist immer noch der Gewinner.
mindplay.dk