Ignacio Vazquez-Abrams ma rację, ale zobaczmy dokładnie, jak to działa ...
Od 15.1.2.2 parseInt (string , radix)
:
Po wywołaniu funkcji parseInt podejmowane są następujące kroki:
- Niech inputString będzie ToString (ciąg).
- Niech S będzie nowo utworzonym podciągiem inputString składającym się z pierwszego znaku, który nie jest StrWhiteSpaceChar i wszystkich znaków następujących po tym znaku. (Innymi słowy, usuń wiodące białe spacje).
- Niech znak będzie 1.
- Jeśli S nie jest puste, a pierwszy znak S jest znakiem minus -, niech znak będzie −1.
- Jeśli S nie jest puste, a pierwszy znak S jest znakiem plus + lub znakiem minus -, usuń pierwszy znak z S.
- Niech R = ToInt32 (podstawa).
- Niech stripPrefix będzie prawdziwy.
- Jeśli R ≠ 0, to a. Jeśli R <2 lub R> 36, zwróć NaN. b. Jeśli R = 16, niech stripPrefix ma wartość false.
- W przeciwnym razie R = 0 a. Niech R = 10.
- Jeśli stripPrefix ma wartość true, to a. Jeśli długość S wynosi co najmniej 2, a pierwsze dwa znaki S mają albo „0x”, albo „0X”, usuń pierwsze dwa znaki z S i niech R = 16.
- Jeśli S zawiera dowolny znak, który nie jest cyfrą Rx, to niech Z będzie podciągiem S składającym się ze wszystkich znaków przed pierwszym takim znakiem; w przeciwnym razie niech Z będzie S.
- Jeśli Z jest puste, zwróć NaN.
- Niech matath nie będzie matematyczną liczbą całkowitą reprezentowaną przez Z w notacji Radix-R, używając liter AZ i az dla cyfr o wartościach od 10 do 35. (Jeżeli jednak R wynosi 10, a Z zawiera więcej niż 20 cyfr znaczących, każda znacząca cyfra po 20. może zostać zastąpiona cyfrą 0, zależnie od opcji implementacji; a jeśli R nie jest 2, 4, 8, 10, 16 lub 32, to matematyka może być zależnym od implementacji przybliżeniem liczby całkowitej matematycznej wartość reprezentowana przez Z w notacji radix-R).
- Niech liczba będzie wartością liczbową dla mathInt.
- Znak powrotu × liczba.
UWAGA parseInt może interpretować tylko wiodącą część ciągu jako wartość całkowitą; ignoruje wszelkie znaki, których nie można interpretować jako część notacji liczb całkowitych, i nie podano żadnych wskazówek, że takie znaki były ignorowane.
Istnieją tutaj dwie ważne części. Pogrubiłem ich obu. Przede wszystkim musimy dowiedzieć się, na czym polega toString
reprezentacja null
. Informacje te znajdują się Table 13 — ToString Conversions
w rozdziale 9.8.0:
Świetnie, więc teraz wiemy, że wykonywanie toString(null)
wewnętrznie daje 'null'
ciąg. Świetnie, ale jak dokładnie obsługuje cyfry (znaki), które nie są poprawne w podanym podstawce?
Patrzymy wyżej 15.1.2.2
i widzimy następującą uwagę:
Jeśli S zawiera dowolny znak, który nie jest cyfrą Rx, to niech Z będzie podciągiem S składającym się ze wszystkich znaków przed pierwszym takim znakiem; w przeciwnym razie niech Z będzie S.
Oznacza to, że obsługujemy wszystkie cyfry PRZED podaną podstawą i ignorujemy wszystko inne.
Zasadniczo robienie parseInt(null, 23)
jest tym samym, co parseInt('null', 23)
. u
Powoduje dwa l
„s być ignorowane (mimo że są one częścią radix 23). Dlatego możemy tylko parsować n
, dzięki czemu cała instrukcja jest synonimem parseInt('n', 23)
. :)
Tak czy inaczej, świetne pytanie!