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?
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?
Antworten:
parseFloat
/ parseInt
dient 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 parseFloat
die Zahl aus der Zeichenfolge abgeschnitten, während angegeben Number
wird NaN
(keine Zahl):
parseFloat('1x'); // => 1
Number('1x'); // => NaN
Darüber hinaus Number
versteht hexadezimale Eingabe, während parseFloat
nicht:
parseFloat('0x10'); // => 0
Number('0x10'); // => 16
Aber Number
wirkt 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 Number
ich es vernünftiger, daher verwende ich es fast immer Number
persönlich (und Sie werden feststellen, dass viele der internen JavaScript-Funktionen auch verwendet Number
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 Fall parseFloat
ist 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 parseFloat
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 Verwendung Number
als 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.
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ährend parseFloat
"so viel wie möglich" analysiert wird. Bei Aufruf der leeren Zeichenfolge wird Number
zurückgegeben, 0
wä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
NaN != NaN
obwohl
NaN != NaN
bewertet wird - danke für den Tipp!
isNaN(NaN)
kehrttrue
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
Bei leeren Zeichenfolgen sind sie unterschiedlich.
+""
und Number("")
gibt 0 zurück, während parseFloat("")
NaN zurückgegeben wird.
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
;
+x
Gibt 0
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 geben 0
als Ergebnis
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 0
während parseFloat("")
kehrt NaN
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;
parseFloat()
ist immer noch der Gewinner.