Was ist der Unterschied zwischen parseInt () und Number ()?


Antworten:


456

Nun, sie sind semantisch verschieden , der NumberKonstruktor aufgerufen als eine Funktion führt eine Typumwandlung und parseIntfü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 parseIntErkennen 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 parseIntnachfolgende Zeichen ignoriert, die keiner Ziffer der aktuell verwendeten Basis entsprechen.

Der NumberKonstruktor 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 NumberKonstruktors als Funktion:

+"2e1";   // 20
+"0xF";   // 15
+"010";   // 10

Interessant, ignoriert parseInt alle Zeichen, die hinter der Zahl stehen? Denn in meinem Fall würde ich beim Konvertieren lieber ein NaN anstelle der 20 erhalten.
Mark

Ja tut es. Klingt so, als ob Sie definitiv Number ()
Gareth

Okay, ich denke, ich werde mit Number () gehen, aber vielen Dank, dass Sie diesen Punkt und all diese Beispiele geklärt haben! :-)
Mark

1
Danke dafür. Dies ist das erste Mal, dass ich NaN gesehen habe. Für einige Leute kann es hilfreich sein zu wissen, dass NaN mit der Funktion isNaN (Wert) getestet wird. Die Verwendung von "if (value == NaN)" zum Beispiel funktioniert nicht.
WonderfulDay

1
Number()befasst sich mit Oktalen ähnlich wie Hex und Binär:Number('0o10') == 8
Juan Mendes

22
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)

Die ersten beiden bieten eine bessere Leistung, da anstelle eines Objekts ein Grundelement zurückgegeben wird.


20
new Number()ist anders als Number(). typeof Number("123") => number
Gareth

8
Auch new Number("1") != new Number("1"). NIEMALS VERWENDENnew Number . Niemals niemals niemals niemals. Number("1")ist andererseits durchaus vernünftig.
Kragen Javier Sitaker

18
@Kragen, es wäre viel vorteilhafter für die Community, wenn Sie erklären würden, WARUM Sie nicht "neue Nummer" verwenden sollten - anstatt nur "nie" 5 Mal
einzugeben

1
@ken Sehr alter Kommentar, aber für zukünftige Besucher stelle ich mir das vor, weil genau der Grund, den sie anfangs erwähnt haben. Ich analysiere zwei Zahlen let x = new Number("2"); let y = new Number("2");und mache später eine Gleichheitsprüfung aus irgendeinem Grund, die if (x == y) { doSomething(); }logischerweise doSomethingaufgerufen werden sollte. Aber das wird es nicht. Auch wenn Sie nur eine Nummer zu analysieren sind let x = new Number("2");dann x === 2wäre falsch sein. Das ist ein klarer Grund, warum Sie nicht verwenden solltennew Number
Tom C

1
@TomC Sie sehen das Ergebnis eines bearbeiteten Kommentars (das bedeutet das Stiftsymbol nach dem Kommentar). zuvor gab es keine Erklärung, nur starke Ermahnung.
Ken

15

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 von Numberund parseInt. Sie haben sogar "Feature", das 0 für Nicht-Zahlen-Argumente zurückgibt. Hier sind Leistungstests .


1
Die Geschwindigkeit der verschiedenen Ansätze scheint sich mit den Browserrevisionen im Laufe der Zeit zu ändern. Der verknüpfte Test hat sich ebenfalls geändert, und die neueste Version dieses Kommentars ist hier - jsperf.com/number-vs-parseint-vs-plus/39 - zum Glück enthält die Site auch frühere Versionen des Tests
bobo

@ Bobo, sicher. Aus Neugier mit Chrom geprüft - Numberund parseIntimmer noch 99% langsamer als die anderen. Außerdem sind sie auch optisch weniger attraktiv :-)
Saulius

15
Ziehen Sie Codeklarheit immer "nutzlosen" Optimierungen vor. Für die meisten Anwendungsfälle parseIntoder Numbersind vorzuziehen. Wenn Sie einen N64-Emulator mit Millionen von Konvertierungen pro Sekunde programmieren, sollten Sie diese Tricks in Betracht ziehen.
Ngryman

1
Die Frage bezieht sich auf das Verhalten, die Diskussion über die Leistung ist nicht zum Thema.
Pneumatik

1
Beachten Sie, dass dies nicht für große Ganzzahlen verwendet werden kann - insbesondere für Ganzzahlen, die nicht in eine vorzeichenbehaftete 32-Bit-Ganzzahl passen -, da bitweise Operatoren in JavaScript ihre Operanden als eine Folge von 32 Bit und nicht als Dezimalzahl behandeln. Hexadezimal- oder Oktalzahlen. Daher (2**31).toString() >> 0wird überlaufen -2147483648. Sie können verwenden, >>>anstatt >>JavaScript den Operanden als vorzeichenlose 32-Bit-Ganzzahl behandeln zu lassen, aber dann 2**32 - 1laufen auch alle Zahlen, die größer als sind, über.
hasc


6

Ein kleiner Unterschied ist, was sie konvertieren undefinedoder null,

Number() Or Number(null) // returns 0

während

parseInt() Or parseInt(null) // returns NaN

6

Zusammenfassung:

parseInt()::

  • Nimmt eine Zeichenfolge als erstes Argument, den Radix (eine Ganzzahl, die die Basis eines Zahlensystems ist, z. B. Dezimalzahl 10 oder Binärzahl 2) als zweites Argument
  • Die Funktion gibt eine Ganzzahl zurück, wenn das erste Zeichen nicht in eine Zahl konvertiert werden kann NaN wird dies zurückgegeben.
  • Wenn die 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.
  • Wenn der Radix undefinedoder 0 ist, nimmt JS Folgendes an:
    • Wenn die Eingabezeichenfolge mit "0x" oder "0X" beginnt, der Radix 16 (hexadezimal) ist, wird der Rest der Zeichenfolge in eine Zahl analysiert.
    • Wenn der Eingabewert mit einer 0 beginnt, kann der Radix entweder 8 (oktal) oder 10 (dezimal) sein. Welcher Radix ausgewählt wird, hängt von der Implementierung der JS-Engine ab. ES5Gibt 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.
    • Wenn der Eingabewert mit einer beliebigen Zahl beginnt, beträgt der Radix 10

Number()::

  • Der Number()Konstruktor kann jede eingegebene Argumentation in eine Zahl umwandeln. Wenn der Number()Konstruktor die Eingabe nicht in eine Zahl konvertieren kann,NaN wird sie zurückgegeben.
  • Der Number()Konstruktor kann auch Hexadezimalzahlen verarbeiten, mit denen sie beginnen müssen 0x.

Beispiel:

console.log(parseInt('0xF', 16));  // 15

// z is no number, it will only evaluate 0xF, therefore 15 is logged
console.log(parseInt('0xFz123', 16));

// because the radix is 10, A is considered a letter not a number (like in Hexadecimal)
// Therefore, A will be cut off the string and 10 is logged
console.log(parseInt('10A', 10));  // 10

// first character isnot a number, therefore parseInt will return NaN
console.log(parseInt('a1213', 10));


console.log('\n');


// start with 0X, therefore Number will interpret it as a hexadecimal value
console.log(Number('0x11'));

// Cannot be converted to a number, NaN will be returned, notice that
// the number constructor will not cut off a non number part like parseInt does
console.log(Number('123A'));

// scientific notation is allowed
console.log(Number('152e-1'));  // 15.21


5

Ich benutze ParseInt immer, aber passen sie von führenden Nullen , die es in Kraft wird Oktal - Modus.


35
Ich denke , es ist immer eine gute Idee , einen Radix liefern parseInt(value, radix)diese Weise müssen Sie nicht auf zufällige Oktal - Modus Conversions etc.
awesomo

Führende Nullen wird es in Oktal - Modus zwingen , in ECMAScript 3. ECMAScript 5 wird es analysieren 0, auch in nicht-Strict - Modus. Aber dies wurde behoben und jetzt werden führende Nullen einfach ignoriert, so parseInt("070")würde es werden 70.
Piotrek Hryciuk

2
Sie sollten auch einen Linter verwenden, der Sie warnt, einen Radix-Wert anzugeben parseInt().
Justin

2

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.

Number("")//0
parseInt("")//NaN

Number("123")//123
parseInt("123")//123

Number("123ac") //NaN,as it is a non numeric string
parsInt("123ac") //123,it parse decimal number outof string

Number(true)//1
parseInt(true) //NaN

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 verwenden


1

parseInt konvertiert in eine Ganzzahl, dh es werden Dezimalstellen entfernt. Number wird nicht in Integer konvertiert.


1

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?

parseInt(0.001, 10)
0

parseInt(-0.0000000001, 10)
-1

parseInt(0.0000000001, 10)
1

parseInt(4000000000000000000000, 10)
4

Es schlachtet wirklich große oder sehr kleine Zahlen. Seltsamerweise funktioniert es normal, wenn diese Eingaben eine Zeichenfolge sind.

parseInt("-0.0000000001", 10)
0

parseInt("0.0000000001", 10)
0

parseInt("4000000000000000000000", 10)
4e+21

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.