Was sind die Unterschiede zwischen dieser Zeile:
var a = parseInt("1", 10); // a === 1
und diese Zeile
var a = +"1"; // a === 1
Dieser jsperf-Test zeigt, dass der unäre Operator in der aktuellen Chrome-Version viel schneller ist, vorausgesetzt, es handelt sich um node.js!?
Wenn ich versuche, Zeichenfolgen zu konvertieren, die keine Zahlen sind, geben beide Folgendes zurück NaN
:
var b = parseInt("test" 10); // b === NaN
var b = +"test"; // b === NaN
Also, wann sollte ich es vorziehen, parseInt
das unäre Plus zu verwenden (besonders in node.js) ???
edit : und was ist der Unterschied zum Double Tilde Operator ~~
?
javascript
node.js
hereandnow78
quelle
quelle
Antworten:
In dieser Antwort finden Sie eine vollständigere Sammlung von Fällen
Nun, hier sind einige Unterschiede, die ich kenne:
Eine leere Zeichenfolge wird zu a
""
ausgewertet0
, währendparseInt
sie zu a ausgewertet wirdNaN
. IMO sollte eine leere Zeichenfolge a seinNaN
.Das Unäre
+
verhält sich eher so,parseFloat
als würde es auch Dezimalstellen akzeptieren.parseInt
Auf der anderen Seite wird das Parsen beendet, wenn ein nicht numerisches Zeichen angezeigt wird, z. B. der Punkt, der als Dezimalpunkt gedacht ist.
.parseInt
undparseFloat
analysiert und erstellt die Zeichenfolge von links nach rechts . Wenn sie ein ungültiges Zeichen sehen, wird zurückgegeben, was (falls vorhanden) als ZahlNaN
analysiert wurde , und wenn keines als Zahl analysiert wurde.Das Unary
+
hingegen wird zurückgegeben,NaN
wenn die gesamte Zeichenfolge nicht in eine Zahl konvertierbar ist.Wie im Kommentar von gesehen @ Alex K. ,
parseInt
undparseFloat
wird durch Zeichen analysieren. Dies bedeutet, dass Hex- und Exponentennotationen fehlschlagen, da diex
unde
als nicht numerische Komponenten behandelt werden (zumindest auf base10).Der Unary
+
wird sie jedoch richtig konvertieren.quelle
+"0xf" != parseInt("0xf", 10)
Math.floor()
, was im Grunde den Dezimalteil abschneidet."2e3"
ist keine gültige Ganzzahldarstellung für2000
. Es ist jedoch eine gültige Gleitkommazahl:parseFloat("2e3")
Wird2000
als Antwort korrekt ausgegeben. Und"0xf"
erfordert mindestens Basis 16, weshalbparseInt("0xf", 10)
zurückgegeben wird0
, währendparseInt("0xf", 16)
der von Ihnen erwartete Wert von 15 zurückgegeben wird.Math.floor(-3.5) == -4
und~~-3.5 == -3
.Die ultimative Umrechnungstabelle für beliebige Zahlen:
Code-Snippet anzeigen
quelle
"NaN"
diese Tabelle.isNaN
Spalte dieser Tabelle: zum BeispielisNaN("")
falsch ist (dh es ist eine Zahl betrachtet), aberparseFloat("")
istNaN
, was ein Gotcha sein kann, wenn Sie zu verwenden sind versucht ,isNaN
die Eingabe zu bestätigen , bevor es vorbeiparseFloat
'{valueOf: function(){return 42}, toString: function(){return "56"}}'
zur Liste hinzufügen . Die gemischten Ergebnisse sind interessant.+
nur eine kürzere Schreibweise istNumber
, und die weiteren sind nur verrückte Methoden, die in Randfällen fehlschlagen?Die Tabelle in der Antwort von thg435 ist meines Erachtens umfassend, wir können sie jedoch mit den folgenden Mustern zusammenfassen:
true
an 1, aber"true"
anNaN
.parseInt
ist es liberaler für Zeichenfolgen, die keine reinen Ziffern sind.parseInt('123abc') === 123
, während+
BerichteNaN
.Number
akzeptiert gültige Dezimalzahlen, währendparseInt
lediglich alles nach der Dezimalstelle abgelegt wird.parseInt
Imitiert somit das C-Verhalten, ist aber möglicherweise nicht ideal für die Auswertung von Benutzereingaben.parseInt
Da es sich um einen schlecht gestalteten Parser handelt , werden oktale und hexadezimale Eingaben akzeptiert. Unary Plus nimmt nur hexademisch.Falsche Werte werden wie
Number
folgt konvertiert, was in C sinnvoll wäre:null
undfalse
sind beide Null.""
auf 0 zu gehen folgt dieser Konvention nicht ganz, macht aber für mich genug Sinn.Daher denke ich, wenn Sie Benutzereingaben validieren, hat unary plus für alles das richtige Verhalten, außer dass es Dezimalstellen akzeptiert (aber in meinen realen Fällen bin ich mehr daran interessiert, E-Mail-Eingaben anstelle von Benutzer-IDs abzufangen, der Wert wird komplett weggelassen usw.) parseInt ist zu liberal.
quelle
Seien Sie vorsichtig, parseInt ist schneller als der unäre Operator + in Node.JS. Es ist falsch, dass + oder | 0 schneller sind, sie sind nur für NaN-Elemente schneller.
Überprüfen Sie dies heraus:
quelle
Berücksichtigen Sie auch die Leistung . Ich war überrascht, dass es
parseInt
unter iOS unary plus schlägt :) Dies ist nur für Web-Apps mit hohem CPU-Verbrauch hilfreich. Als Faustregel würde ich JS-Optikern empfehlen, jeden JS-Betreiber heutzutage unter dem Gesichtspunkt der mobilen Leistung gegenüber einem anderen zu betrachten.Also, geh zuerst mobil ;)
quelle