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?
javascript
optimization
Namanyay Goel
quelle
quelle
Antworten:
Der Unterschied zwischen parseFloat und Number
parseFloat
/parseInt
dient zum Parsen einer Zeichenfolge, währendNumber
/+
zum Erzwingen eines Werts zu einer Zahl dient. Sie verhalten sich anders. Aber schauen wir uns zuerst an, wo sie sich gleich verhalten: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
parseFloat
die Zahl aus der Zeichenfolge abgeschnitten, während angegebenNumber
wirdNaN
(keine Zahl):Darüber hinaus
Number
versteht hexadezimale Eingabe, währendparseFloat
nicht:Aber
Number
wirkt seltsam mit leeren Zeichenfolgen oder Zeichenfolgen, die nur Leerzeichen enthalten:Im Großen und Ganzen finde
Number
ich es vernünftiger, daher verwende ich es fast immerNumber
persönlich (und Sie werden feststellen, dass viele der internen JavaScript-Funktionen auch verwendetNumber
werden). 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 FallparseFloat
ist dies hilfreich, da Stile in einer Form vorliegen'3px'
. In diesem Fall möchte ich das'px'
Teil löschen und nur das erhalten3
, sodass ich esparseFloat
hilfreich 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 VerwendungNumber
als Funktion entspricht:Also benutze ich normalerweise nur
+
kurz. Solange Sie wissen, was es tut, finde ich es leicht zu lesen.quelle
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.Number('Infinity') === Infinity
währendparseInt('Infinity') === NaN
+
(unäres Plus) verwenden, denn wenn Sie ein Semikolon in der vorherigen Zeile vergessen, wird möglicherweise stattdessen ein Additionsausdruck ausgewertet.Der Unterschied besteht darin, was passiert, wenn die Eingabe keine "richtige Zahl" ist.
Number
kehrt zurück,NaN
währendparseFloat
"so viel wie möglich" analysiert wird. Bei Aufruf der leeren Zeichenfolge wirdNumber
zurückgegeben,0
während parseFloat zurückgegeben wirdNaN
.Beispielsweise:
quelle
NaN != NaN
obwohlNaN != NaN
bewertet wird - danke für den Tipp!isNaN(NaN)
kehrttrue
In diesen Beispielen sehen Sie den Unterschied:
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
quelle
Bei leeren Zeichenfolgen sind sie unterschiedlich.
+""
undNumber("")
gibt 0 zurück, währendparseFloat("")
NaN zurückgegeben wird.quelle
parseFloat()
das richtige Ergebnis erzielt wird, da eine leere Zeichenfolge NICHT die Zahl0
(gelesen: NaN) ist, während eine Zeichenfolge mit dem Zeichen"0"
darin IST0
;+x
Gibt0
nicht 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 geben0
als ErgebnisSoweit 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,
+""
undNumber("")
Rückkehr0
währendparseFloat("")
kehrtNaN
so 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;quelle
parseFloat()
ist immer noch der Gewinner.