Wie werden parseInt()
y Number()
sich bei der Umwandlung von Zeichenketten in Zahlen unterschiedlich verhalten?
Antworten
Zu viele Anzeigen?Nun, sie sind semantisch verschieden die Number
Konstruktor als Funktion aufgerufen führt aus. Typkonvertierung y parseInt
führt aus. Parsing , z.B.:
// parsing:
parseInt("20px"); // 20
parseInt("10100", 2); // 20
parseInt("2e1"); // 2
// type conversion
Number("20px"); // NaN
Number("2e1"); // 20, exponential notation
Auch parseInt
ignoriert nachgestellte Zeichen, die keiner Ziffer der aktuell verwendeten Basis entsprechen.
En Number
Konstruktor erkennt keine impliziten Oktale, kann aber die explizite Oktalschreibweise erkennen:
Number("010"); // 10
Number("0o10") // 8, explicit octal
parseInt("010"); // 8, implicit octal
parseInt("010", 10); // 10, decimal radix used
Und es kann Zahlen in hexadezimaler Notation verarbeiten, genau wie parseInt
:
Number("0xF"); // 15
parseInt("0xF"); //15
Ein weit verbreitetes Konstrukt für die Konvertierung von numerischen Typen ist außerdem die Unär +
Bediener (S. 72) ist es gleichbedeutend mit der Verwendung der Number
Konstruktor als Funktion:
+"2e1"; // 20
+"0xF"; // 15
+"010"; // 10
Zusammenfassung:
parseInt()
:
- Nimmt eine Zeichenkette als erstes Argument, das Radix (eine ganze Zahl, die die Basis eines Zahlensystems ist, z. B. Dezimal 10 oder Binär 2) als zweites Argument
- Die Funktion gibt eine ganze Zahl zurück, wenn das erste Zeichen nicht in eine Zahl umgewandelt werden kann
NaN
zurückgegeben werden. - Wenn die
parseInt()
Funktion auf einen nicht numerischen Wert stößt, schneidet sie den Rest der Eingabezeichenfolge ab und analysiert nur den Teil bis zum nicht numerischen Wert. - Wenn das Radix
undefined
oder 0 ist, geht JS von folgenden Annahmen aus:- Wenn die Eingabezeichenfolge mit "0x" oder "0X" beginnt, ist das Radix 16 (hexadezimal), der Rest der Zeichenfolge wird in eine Zahl umgewandelt.
- Beginnt der Eingabewert mit einer 0, kann das Radix entweder 8 (oktal) oder 10 (dezimal) sein. Welches Radix gewählt wird, hängt von der Implementierung der JS-Engine ab.
ES5
gibt an, dass dann 10 verwendet werden sollte. Dies wird jedoch nicht von allen Browsern unterstützt, Geben Sie daher immer radix an, wenn Ihre Zahlen mit einer 0 beginnen können. - Beginnt der Eingabewert mit einer beliebigen Zahl, so ist das Radix 10
Number()
:
- En
Number()
Konstruktor kann jedes eingegebene Argument in eine Zahl umwandeln. Wenn derNumber()
Konstruktor kann die Eingabe nicht in eine Zahl umwandeln,NaN
zurückgegeben werden. - En
Number()
Konstruktor kann auch hexadezimale Zahlen verarbeiten, sie müssen mit0x
.
Ejemplo:
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
Wenn es Ihnen auf Leistung ankommt, erzielen Sie wahrscheinlich die besten Ergebnisse mit der bitweisen Rechtsverschiebung "10">>0
. Auch multiplizieren ( "10" * 1
) oder nicht nicht ( ~~"10"
). Sie alle sind viel schneller als Number
y parseInt
. Sie haben sogar "Funktion", die 0 für nicht Nummer Argument zurückgibt. Hier sind Leistungstests .
- See previous answers
- Weitere Antworten anzeigen