Ich frage dies nur, um ein paar Bytes zu rasieren.
Ich weiß, dass ich es gebrauchen kann +x
(unäres Plus) statt Number(x)
. Gibt es einen Unterschied zwischen denen und parseFloat
?
Namanyay Goel
Ich frage dies nur, um ein paar Bytes zu rasieren.
Ich weiß, dass ich es gebrauchen kann +x
(unäres Plus) statt Number(x)
. Gibt es einen Unterschied zwischen denen und parseFloat
?
Nathan Wand
parseFloat
/parseInt
dient zum Analysieren einer Zeichenfolge, während Number
/+
dient zum Erzwingen eines Werts in eine Zahl. 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 also eine standardmäßige numerische Eingabe haben, gibt es keinen Unterschied. Wenn Ihre Eingabe jedoch mit einer Zahl beginnt und dann andere Zeichen enthält, parseFloat
schneidet die Zahl aus der Zeichenfolge ab, während Number
gibt NaN
(keine Zahl):
parseFloat('1x'); // => 1
Number('1x'); // => NaN
Und dazu, Number
versteht hexadezimale Eingabe während parseFloat
nicht:
parseFloat('0x10'); // => 0
Number('0x10'); // => 16
Aber Number
verhält sich 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 ich Number
um vernünftiger zu sein, also benutze ich fast immer Number
persönlich (und Sie werden feststellen, dass viele der internen JavaScript-Funktionen verwendet werden Number
auch). Wenn jemand tippt '1x'
Ich ziehe es vor, einen Fehler anzuzeigen, anstatt ihn so zu behandeln, als ob sie getippt hätten '1'
. Das einzige Mal, dass ich wirklich eine Ausnahme mache, ist, wenn ich einen Stil in eine Zahl umwandle, in diesem Fall parseFloat
ist hilfreich, weil Stile in einer Form wie kommen '3px'
in diesem Fall möchte ich die löschen 'px'
Teil und hol dir einfach die 3
so finde ich parseFloat
hier hilfreich. Aber für welche Sie sich entscheiden, bleibt Ihnen überlassen und welche Eingabeformen Sie akzeptieren möchten.
Beachten Sie, dass die Verwendung des unären +
operator ist genau dasselbe wie using Number
als eine Funktion:
Number('0x10'); // => 16
+'0x10'; // => 16
Number('10x'); // => NaN
+'10x'; // => NaN
Number('40'); // => 40
+'40'; // => 40
Also verwende ich meistens nur +
kurz. Solange Sie wissen, was es tut, finde ich es leicht zu lesen.
würde ich nicht in Betracht ziehen Leerzeichen => 0 Verhalten von Number()
Als “seltsam” würde ich es sogar als eher zu erwarten betrachten, Whitespace ist ein leerer Wert, aber er ist nicht null/undefiniert => 0 ist ein schönes Ergebnis. Big (+) für Sie für die Vitrinen sowieso 🙂
– jave.web
6. Februar 2014 um 19:47 Uhr
@NathanWall: Vielleicht möchte ich das erwähnen Number('Infinity') === Infinity
wohingegen parseInt('Infinity') === NaN
– sstur
18. August 2014 um 21:51 Uhr
würde ich nicht verwenden +
(unäres Plus) dafür, denn wenn Sie ein Semikolon in der vorherigen Zeile vergessen, könnte stattdessen ein Additionsausdruck ausgewertet werden.
– Jackson
27. April 2017 um 23:36 Uhr
Für die Fälle, in denen sie sich gleich verhalten, habe ich herausgefunden, dass parseFloat 1% bis 15% langsamer ist und langsamer wird, wenn die Anzahl der Dezimalstellen in einer Zeichenfolge zunimmt. Bei 1M Lauf 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 entscheide ich mich für Number().
– Bytebereich
9. Mai 2019 um 14:06 Uhr
@ChrisBrownie55 Wow, guter Fang. Ich wusste nicht, dass parseFloat das kann. Ich denke, Infinity ist keine ganze Zahl!
– sstur
31. Dezember 2019 um 18:49 Uhr
Jon
Der Unterschied besteht darin, was passiert, wenn die Eingabe keine “richtige Zahl” ist. Number
kehrt zurück NaN
während parseFloat
analysiert “so viel wie es kann”. Wenn auf der leeren Zeichenfolge aufgerufen Number
kehrt zurück 0
während parseFloat zurückkehrt NaN
.
Zum Beispiel:
Number("") === 0 // also holds for false
isNaN(parseFloat("")) === true // and null
isNaN(Number("32f")) === true
parseFloat("32f") === 32
Beachten Sie, dass NaN != NaN
obwohl
– Wex
19. Mai 2013 um 5:16 Uhr
@Wex Oh, das meinst du NaN != NaN
wertet zu WAHR – Danke für den Tipp !
– jave.web
6. Februar 2014 um 19:39 Uhr
verwenden istNaN() zum Testen des NaN-Wertes, isNaN(NaN)
kehrt zurück true
– jave.web
6. Februar 2014 um 19:52 Uhr
Mikrofon
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, weil es nach dem ersten Auftreten einer Zahl in einer Zeichenfolge sucht, während der Number-Konstruktor eine neue Zahleninstanz aus Zeichenfolgen erstellt, die numerische Werte mit Leerzeichen oder falsche Werte enthalten.
Für leere Zeichenfolgen sind sie unterschiedlich.
+""
und Number("")
gibt 0 zurück, während parseFloat("")
gibt NaN zurück.
Christoph
Soweit ich weiß und dies nur von Kollegen gehört wurde, die möglicherweise völlig schlecht informiert sind, ist parseFloat geringfügig schneller.
Bei weiterer Recherche scheint es jedoch, dass dieser Leistungsunterschied browserabhängig ist.
http://jsperf.com/parseint-vs-parsefloat/6
Sehen Sie sich diese jsPerf-Ergebnisse an und rufen Sie an. (es enthält auch +x-Tests)
Wie in der Antwort von @xdazz erwähnt, +""
und Number("")
Rückkehr 0
während parseFloat("")
kehrt zurück NaN
Also wieder würde ich mit parseFloat gehen, denn ein leerer String bedeutet NICHT die Zahl 0, sondern nur einen String mit dem Zeichen "0"
darin bedeutet 0;
Hier ist ein ausführlicherer Test Angeln nach einem schnelleren Weg zur Konvertierung … parseFloat()
ist immer noch der Gewinner.
– mindplay.dk
15. November 2013 um 16:15 Uhr
Hier ist ein ausführlicherer Test Angeln nach einem schnelleren Weg zur Konvertierung … parseFloat()
ist immer noch der Gewinner.
– mindplay.dk
15. November 2013 um 16:15 Uhr
@Christian: Alle Zahlen in Javascript sind Floats mit doppelter Genauigkeit.
– Gufa
1. September 2012 um 12:32 Uhr