Wie parseInt()
und Number()
anders verhalten , wenn Strings in Zahlen umzuwandeln?
quelle
Wie parseInt()
und Number()
anders verhalten , wenn Strings in Zahlen umzuwandeln?
Nun, sie sind semantisch verschieden , der Number
Konstruktor aufgerufen als eine Funktion führt eine Typumwandlung und parseInt
führt das Parsen , zB:
// parsing:
parseInt("20px"); // 20
parseInt("10100", 2); // 20
parseInt("2e1"); // 2
// type conversion
Number("20px"); // NaN
Number("2e1"); // 20, exponential notation
Beachten Sie, dass beim parseInt
Erkennen einer führenden Null in der Zeichenfolge die Zahl in Oktalbasis analysiert wird. Dies hat sich in ECMAScript 5, der neuen Version des Standards, geändert. Es dauert jedoch lange, bis Browser-Implementierungen verfügbar sind Bei einer Inkompatibilität mit ECMAScript 3) werden auch parseInt
nachfolgende Zeichen ignoriert, die keiner Ziffer der aktuell verwendeten Basis entsprechen.
Der Number
Konstruktor erkennt keine Oktale:
Number("010"); // 10
parseInt("010"); // 8, implicit octal
parseInt("010", 10); // 10, decimal radix used
Aber es kann Zahlen in hexadezimaler Notation verarbeiten, genau wie parseInt
:
Number("0xF"); // 15
parseInt("0xF"); //15
Ein weit verbreitetes Konstrukt zur Durchführung der numerischen Typkonvertierung ist der Unäre +
Operator (S. 72). Dies entspricht der Verwendung des Number
Konstruktors als Funktion:
+"2e1"; // 20
+"0xF"; // 15
+"010"; // 10
Number()
befasst sich mit Oktalen ähnlich wie Hex und Binär:Number('0o10') == 8
Die ersten beiden bieten eine bessere Leistung, da anstelle eines Objekts ein Grundelement zurückgegeben wird.
quelle
new Number()
ist anders alsNumber()
.typeof Number("123") => number
new Number("1") != new Number("1")
. NIEMALS VERWENDENnew Number
. Niemals niemals niemals niemals.Number("1")
ist andererseits durchaus vernünftig.let x = new Number("2"); let y = new Number("2");
und mache später eine Gleichheitsprüfung aus irgendeinem Grund, dieif (x == y) { doSomething(); }
logischerweisedoSomething
aufgerufen werden sollte. Aber das wird es nicht. Auch wenn Sie nur eine Nummer zu analysieren sindlet x = new Number("2");
dannx === 2
wäre falsch sein. Das ist ein klarer Grund, warum Sie nicht verwenden solltennew Number
Wenn Sie nach Leistung suchen, erzielen Sie wahrscheinlich die besten Ergebnisse mit einer bitweisen Rechtsverschiebung
"10">>0
. Multiplizieren Sie auch ("10" * 1
) oder nicht (~~"10"
). Alle von ihnen sind viel schneller vonNumber
undparseInt
. Sie haben sogar "Feature", das 0 für Nicht-Zahlen-Argumente zurückgibt. Hier sind Leistungstests .quelle
Number
undparseInt
immer noch 99% langsamer als die anderen. Außerdem sind sie auch optisch weniger attraktiv :-)parseInt
oderNumber
sind vorzuziehen. Wenn Sie einen N64-Emulator mit Millionen von Konvertierungen pro Sekunde programmieren, sollten Sie diese Tricks in Betracht ziehen.(2**31).toString() >> 0
wird überlaufen-2147483648
. Sie können verwenden,>>>
anstatt>>
JavaScript den Operanden als vorzeichenlose 32-Bit-Ganzzahl behandeln zu lassen, aber dann2**32 - 1
laufen auch alle Zahlen, die größer als sind, über.Ich fand zwei Links Leistung unter mehreren Möglichkeiten zu vergleichen , der Umwandlung
string
zuint
.http://jsben.ch/#/zGJHM
http://phrogz.net/js/string_to_number.html
quelle
Ein kleiner Unterschied ist, was sie konvertieren
undefined
odernull
,während
quelle
Zusammenfassung:
parseInt()
::NaN
wird dies zurückgegeben.parseInt()
Funktion auf einen nicht numerischen Wert stößt, wird der Rest der Eingabezeichenfolge abgeschnitten und der Teil nur bis zum nicht numerischen Wert analysiert.undefined
oder 0 ist, nimmt JS Folgendes an:ES5
Gibt an, dass dann 10 verwendet werden soll. Dies wird jedoch nicht von allen Browsern unterstützt. Geben Sie daher immer radix an, wenn Ihre Zahlen mit einer 0 beginnen können.Number()
::Number()
Konstruktor kann jede eingegebene Argumentation in eine Zahl umwandeln. Wenn derNumber()
Konstruktor die Eingabe nicht in eine Zahl konvertieren kann,NaN
wird sie zurückgegeben.Number()
Konstruktor kann auch Hexadezimalzahlen verarbeiten, mit denen sie beginnen müssen0x
.Beispiel:
quelle
Ich benutze ParseInt immer, aber passen sie von führenden Nullen , die es in Kraft wird Oktal - Modus.
quelle
parseInt(value, radix)
diese Weise müssen Sie nicht auf zufällige Oktal - Modus Conversions etc.0
, auch in nicht-Strict - Modus. Aber dies wurde behoben und jetzt werden führende Nullen einfach ignoriert, soparseInt("070")
würde es werden70
.parseInt()
.parseInt()
-> Analysiert eine Zahl nach angegebenem Redix.Number()
-> Konvertiert den angegebenen Wert in sein numerisches Äquivalent oder NaN, wenn dies nicht der Fall ist.Daher sollten wir zum Konvertieren eines nicht numerischen Werts in eine Zahl immer die Funktion Number () verwenden.
z.B.
Bei
parseInt()
der Redix-Konvertierung gibt es verschiedene Eckfälle für Funktionen. Daher sollten wir die Verwendung der Funktion parseInt () für Koerzitionszwecke vermeiden.Um zu überprüfen, ob der angegebene Wert numerisch ist oder nicht, sollten wir die native
isNaN()
Funktion verwendenquelle
parseInt konvertiert in eine Ganzzahl, dh es werden Dezimalstellen entfernt. Number wird nicht in Integer konvertiert.
quelle
Es ist eine gute Idee, sich von parseInt fernzuhalten und Number und Math.round zu verwenden, es sei denn, Sie benötigen Hex oder Oktal. Beide können Zeichenfolgen verwenden. Warum sich davon fernhalten?
Es schlachtet wirklich große oder sehr kleine Zahlen. Seltsamerweise funktioniert es normal, wenn diese Eingaben eine Zeichenfolge sind.
Anstatt das Risiko einzugehen, Fehler mit diesem und den anderen erwähnten Fallstricken zu finden, würde ich parseInt nur vermeiden, es sei denn, Sie müssen etwas anderes als Basis 10 analysieren. Number, Math.round, Math.foor und .toFixed (0) können alle Machen Sie die gleichen Dinge, für die parseInt verwendet werden kann, ohne diese Art von Fehlern zu haben.
Wenn Sie parseInt wirklich für einige seiner anderen Eigenschaften verwenden möchten oder müssen, verwenden Sie es niemals, um Floats in Ints umzuwandeln.
quelle