Ignacio Vazquez-Abrams ist richtig, aber lassen Sie uns genau sehen, wie es funktioniert ...
Von 15.1.2.2 parseInt (string , radix)
:
Wenn die Funktion parseInt aufgerufen wird, werden die folgenden Schritte ausgeführt:
- Sei inputString ToString (string).
- Sei S eine neu erstellte Teilzeichenfolge von inputString, die aus dem ersten Zeichen, das kein StrWhiteSpaceChar ist, und allen Zeichen besteht, die diesem Zeichen folgen. (Mit anderen Worten, entfernen Sie den führenden Leerraum.)
- Das Zeichen sei 1.
- Wenn S nicht leer ist und das erste Zeichen von S ein Minuszeichen - ist, sei das Vorzeichen −1.
- Wenn S nicht leer ist und das erste Zeichen von S ein Pluszeichen + oder ein Minuszeichen - ist, entfernen Sie das erste Zeichen aus S.
- Sei R = ToInt32 (Radix).
- Lassen Sie stripPrefix wahr sein.
- Wenn R ≠ 0 ist, dann a. Wenn R 2 oder R 36, dann NaN zurückgeben. b. Wenn R ≠ 16 ist, sei stripPrefix falsch.
- Sonst ist R = 0 a. Sei R = 10.
- Wenn stripPrefix wahr ist, dann a. Wenn die Länge von S mindestens 2 beträgt und die ersten beiden Zeichen von S entweder "0x" oder "0X" sind, entfernen Sie die ersten beiden Zeichen aus S und lassen Sie R = 16.
- Wenn S ein Zeichen enthält, das keine Radix-R-Ziffer ist, dann sei Z die Teilzeichenfolge von S, die aus allen Zeichen vor dem ersten solchen Zeichen besteht. andernfalls sei Z S.
- Wenn Z leer ist, geben Sie NaN zurück.
- Sei mathInt der mathematische ganzzahlige Wert, der durch Z in Radix-R-Notation dargestellt wird, wobei die Buchstaben AZ und az für Ziffern mit den Werten 10 bis 35 verwendet werden. (Wenn R jedoch 10 ist und Z mehr als 20 signifikante Ziffern enthält, jede signifikante Eine Ziffer nach der 20. kann nach Wahl der Implementierung durch eine 0-Ziffer ersetzt werden. Wenn R nicht 2, 4, 8, 10, 16 oder 32 ist, kann mathInt eine implementierungsabhängige Annäherung an die mathematische Ganzzahl sein Wert, der durch Z in Radix-R-Notation dargestellt wird.)
- Die Zahl sei der Zahlenwert für mathInt.
- Rückgabezeichen × Nummer.
HINWEIS parseInt interpretiert möglicherweise nur einen führenden Teil der Zeichenfolge als ganzzahligen Wert. Zeichen, die nicht als Teil der Notation einer Ganzzahl interpretiert werden können, werden ignoriert, und es wird kein Hinweis darauf gegeben, dass solche Zeichen ignoriert wurden.
Hier gibt es zwei wichtige Teile. Ich habe beide gewagt. Also müssen wir zuerst herausfinden, was die toString
Darstellung von null
ist. Wir müssen Table 13 — ToString Conversions
in Abschnitt 9.8.0 nach diesen Informationen suchen :
Großartig, jetzt wissen wir also, dass toString(null)
internes Handeln eine 'null'
Zeichenfolge ergibt . Großartig, aber wie genau werden Ziffern (Zeichen) behandelt, die innerhalb des angegebenen Radix nicht gültig sind?
Wir schauen nach oben 15.1.2.2
und sehen die folgende Bemerkung:
Wenn S ein Zeichen enthält, das keine Radix-R-Ziffer ist, dann sei Z die Teilzeichenfolge von S, die aus allen Zeichen vor dem ersten solchen Zeichen besteht. andernfalls sei Z S.
Das bedeutet, dass wir alle Ziffern VOR dem angegebenen Radix behandeln und alles andere ignorieren.
Im Grunde ist das Tun parseInt(null, 23)
dasselbe wie parseInt('null', 23)
. Dies u
bewirkt, dass die beiden l
ignoriert werden (obwohl sie Teil des Radix 23 sind). Daher können wir nur analysieren n
, was die gesamte Aussage synonym macht parseInt('n', 23)
. :) :)
Wie auch immer, tolle Frage!