W porządku, więc bawiłem się parsowaniem, żeby zobaczyć, jak radzi sobie z wartościami, które nie zostały jeszcze zainicjowane, i natknąłem się na ten klejnot. Poniższe dzieje się w przypadku dowolnego podstawnika 24 lub nowszego.
parseInt(null, 24) === 23 // evaluates to true
Przetestowałem to w IE, Chrome i Firefox i wszystkie alarmy są prawdziwe, więc myślę, że musi to być gdzieś w specyfikacji. Szybkie wyszukiwanie w Google nie dało mi żadnych wyników, więc mam nadzieję, że ktoś może to wyjaśnić.
Pamiętam, jak słuchałem przemówienia Crockforda typeof null === "object"
z powodu niedopatrzenia, które spowodowało, że Object i Null mają w pamięci niemal identyczny typ identyfikatora lub coś podobnego, ale nie mogę teraz znaleźć tego filmu.
Wypróbuj: http://jsfiddle.net/robert/txjwP/
Edytuj korekcję: wyższa podstawa zwraca różne wyniki, 32 zwraca 785077
Edytuj 2 Z zzzzBov:[24...30]:23, 31:714695, 32:785077, 33:859935, 34:939407, 35:1023631, 36:1112745
tl; dr
Wyjaśnij, dlaczego parseInt(null, 24) === 23
jest to prawdziwe stwierdzenie.
źródło
alert(parseInt(null, 34) === 23)
wyprodukowanofalse
alert(parseInt(null,26)===23);
produkuje również prawdziwe?!?![24...30]:23
,31:714695
,32:785077
,33:859935
,34:939407
,35:1023631
,36:1112745
,[37...]:NaN
undefined
ponieważ pierwszy parametr zwraca nieparzyste wyniki dla lat 30-tychOdpowiedzi:
Konwertuje
null
na ciąg"null"
i próbuje go przekonwertować. W przypadku podstaw od 0 do 23 nie ma cyfr, które mógłby przekonwertować, więc zwracaNaN
. W punkcie 24"n"
czternasta litera jest dodawana do systemu liczbowego. W dniu 31"u"
dodaje się 21. literę, a cały ciąg można dekodować. W 37 dniu nie ma już żadnego prawidłowego zestawu liczb, który można wygenerować, a NaN jest zwracany.źródło
toString()
?Mozilla mówi nam :
W specyfikacji 15.1.2.2/1 mówi nam, że konwersja na ciąg znaków jest wykonywana przy użyciu wbudowanego
ToString
, który (zgodnie z 9.8) daje"null"
(nie mylić z tymtoString
, co by dał"[object Window]"
!).Zastanówmy się
parseInt("null", 24)
.Oczywiście nie jest to ciąg liczbowy 24 w całości, ale „n” to: dziesiętny 23 .
Teraz parsowanie zatrzymuje się po wyciągnięciu dziesiętnego 23, ponieważ
"u"
nie występuje w systemie base-24:(I właśnie dlatego
parseInt(null, 23)
(i niższe radie) daje ciNaN
raczej niż 23:"n"
nie ma w systemie base-23).źródło
Ignacio Vazquez-Abrams ma rację, ale zobaczmy dokładnie, jak to działa ...
Od
15.1.2.2 parseInt (string , radix)
:Istnieją tutaj dwie ważne części. Pogrubiłem ich obu. Przede wszystkim musimy dowiedzieć się, na czym polega
toString
reprezentacjanull
. 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ę:Oznacza to, że obsługujemy wszystkie cyfry PRZED podaną podstawą i ignorujemy wszystko inne.
Zasadniczo robienie
parseInt(null, 23)
jest tym samym, coparseInt('null', 23)
.u
Powoduje dwal
„s być ignorowane (mimo że są one częścią radix 23). Dlatego możemy tylko parsowaćn
, dzięki czemu cała instrukcja jest synonimemparseInt('n', 23)
. :)Tak czy inaczej, świetne pytanie!
źródło
Jest równa
co jest równoważne z
Cyfry dla podstawy 24 to 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, ..., n.
Specyfikacja językowa mówi
która jest częścią, która zapewnia, że literały całkowite w stylu C, takie jak
15L
parsowanie poprawnie, więc powyższe jest równoważne"n"
to 23-ta litera powyższej listy cyfr.CO BYŁO DO OKAZANIA
źródło
Chyba
null
zostaje przekształcony w ciąg"null"
. Tak więcn
faktycznie znajduje się23
w „base24” (to samo w „base25” +),u
jest niepoprawne w „base24”, więc reszta ciągunull
zostanie zignorowana. Właśnie dlatego wyświetla dane wyjściowe,23
ażu
stanie się ważny w 'base31'.źródło
parseInt używa reprezentacji alfanumerycznej, następnie w podstawie 24 „n” jest poprawny, ale „u” jest niepoprawnym znakiem, a następnie parsuje tylko parsuje wartość „n” ....
jako przykład spróbuj tego:
Wynik to „3”.
źródło