Ich lese diese aber ich bin verwirrt durch das, was in dem geschrieben steht ParseInt mit einem Radix Argument Kapitel
Warum ist es das parseInt(8, 3)
→ NaN
und parseInt(16, 3)
→ 1
?
AFAIK 8 und 16 sind nicht basen 3 Zahlen, so parseInt(16, 3)
sollte zurückkehren NaN
zu
javascript
numbers
parseint
radix
Devid Farinelli
quelle
quelle
Antworten:
Dies ist etwas, worüber Menschen die ganze Zeit stolpern, selbst wenn sie davon wissen. :-) Sie sehen dies aus dem gleichen Grund.
parseInt("1abc")
Gibt 1 zurück:parseInt
stoppt beim ersten ungültigen Zeichen und gibt alles zurück, was es zu diesem Zeitpunkt hat. Wenn keine gültigen Zeichen zum Parsen vorhanden sind, wird zurückgegebenNaN
.parseInt(8, 3)
bedeutet ""8"
in Basis 3 analysieren " (beachten Sie, dass die Zahl8
in eine Zeichenfolge konvertiert wird ; Details in der Spezifikation ). Aber in der Basis 3, die mit einem einstelligen Zahlen ist nur0
,1
und2
. Es ist, als würde man ihn bitten,"9"
oktal zu analysieren . Da es keine gültigen Zeichen gab, hast duNaN
.parseInt(16, 3)
fordert es auf,"16"
in Basis 3 zu analysieren . Da es das analysieren kann1
, tut es dies und stoppt dann bei,6
weil es es nicht analysieren kann. Also kehrt es zurück1
.Da diese Frage viel Aufmerksamkeit erhält und in den Suchergebnissen möglicherweise einen hohen Stellenwert hat, finden Sie hier eine Übersicht über die Optionen zum Konvertieren von Zeichenfolgen in Zahlen in JavaScript mit ihren verschiedenen Eigenheiten und Anwendungen (aus einer anderen Antwort von mir hier auf SO entnommen):
parseInt(str[, radix])
- Konvertiert so viel wie möglich vom Anfang der Zeichenfolge in eine ganze Zahl (Ganzzahl), wobei zusätzliche Zeichen am Ende ignoriert werden. SoparseInt("10x")
ist es10
; dasx
wird ignoriert. Unterstützt eine optionale radix (Zahlenbasis) Argument, soparseInt("15", 16)
ist21
(15
in hex). Wenn es keinen Radix gibt, wird eine Dezimalzahl angenommen, es sei denn, die Zeichenfolge beginnt mit0x
(oder0X
). In diesem Fall werden diese übersprungen und hexadezimal angenommen. (Einige Browser zu behandeln Strings mit Start0
als Oktal, das Verhalten nie angegeben wurde, und wurde speziell nicht erlaubt in der ES5 - Spezifikation.) Returns ,NaN
wenn keine parseable Stellen zu finden sind.parseFloat(str)
- WieparseInt
, aber Gleitkommazahlen und unterstützt nur Dezimalzahlen. Wiederum werden zusätzliche Zeichen in der Zeichenfolge ignoriert, ebensoparseFloat("10.5x")
wie10.5
(dasx
wird ignoriert). Da nur Dezimalzahlen unterstützt werden,parseFloat("0x15")
ist0
(weil das Parsen am endetx
). Gibt zurück,NaN
wenn keine analysierbaren Ziffern gefunden wurden.Unär
+
, zB+str
- ( zB implizite Konvertierung) Konvertiert die gesamte Zeichenfolge in eine Zahl unter Verwendung von Gleitkomma- und JavaScript-Standardnotationsnotation (nur Ziffern und Dezimalpunkt = Dezimalzahl;0x
Präfix = Hex;0o
Präfix = Oktal [ES2015 +]; einige Implementierungen erweitern sie eine Führung0
als oktal zu behandeln , aber nicht im strengen Modus).+"10x"
ist ,NaN
weil dasx
ist nicht ignoriert.+"10"
ist10
,+"10.5"
ist10.5
,+"0x15"
ist21
,+"0o10"
ist8
[ES2015 +]. Hat ein Gotcha:+""
ist0
, nichtNaN
wie man erwarten könnte.Number(str)
- Genau wie die implizite Konvertierung (z. B. wie+
oben beschrieben), jedoch bei einigen Implementierungen langsamer. (Nicht, dass es wahrscheinlich wichtig wäre.)quelle
parseInt
zuersttoString
das erste Argument verwenden? Das würde Sinn machen.parseInt
Algorithmus: ecma-international.org/ecma-262/7.0/…123e-2
gibt es,1
da es1.23
zuerst wird und dann das Parsen am Dezimalpunkt stoppt?NumberFormatException
jedes Mal eine.parseInt
(das erste Argument zum String zwingen) macht Sinn. Der Zweck vonparseInt
besteht darin, eine Zeichenfolge auf eine ganze Zahl zu analysieren . Wenn Sie ihm also etwas geben, das keine Zeichenfolge ist, ist es sinnvoll, zunächst die Zeichenfolgendarstellung zu erhalten. Was sie tut , nach , dass eine ganze ‚nother Geschichte ...Aus dem gleichen Grund, dass
In dem Dokument ,
parseInt
nimmt einen String. UndAlso
16
,8
oder'1foobar'
wird zuerst in einen String konvertiert.Dann
Das heißt, es konvertiert bis dahin, wo es kann. Die
6
,8
undfoobar
werden ignoriert, und nur das, was vor sich gewandelt. Wenn es nichts gibt,NaN
wird zurückgegeben.quelle
Einige weitere Beispiele:
quelle