Mam irytujący problem z JavaScript .
> parseInt(1 / 0, 19)
> 18
Dlaczego parseInt
funkcja powraca 18
?
javascript
parseint
cebor
źródło
źródło
if
może pomóc.Odpowiedzi:
Rezultatem
1/0
jestInfinity
.parseInt
traktuje swój pierwszy argument jako ciąg znaków, co oznacza przede wszystkim, żeInfinity.toString()
jest wywoływany, tworząc ciąg"Infinity"
. Działa to tak samo, jakbyś poprosił go o konwersję"Infinity"
w podstawie 19 na dziesiętną.Oto cyfry w bazie 19 wraz z ich wartościami dziesiętnymi:
To, co dzieje się potem, polega na
parseInt
skanowaniu danych wejściowych w"Infinity"
celu znalezienia, która część może zostać przeanalizowana i zatrzymuje się po zaakceptowaniu pierwszejI
(ponieważn
nie jest prawidłową cyfrą w bazie 19).Dlatego zachowuje się tak, jakbyś zadzwonił
parseInt("I", 19)
, co konwertuje na liczbę dziesiętną według powyższej tabeli.źródło
parseInt('Infini',24)
.n
jest również poprawna cyfra, więc tak naprawdę kończy sięparseInt("Infini", 24)
.Oto sekwencja wydarzeń:
1/0
ocenia naInfinity
parseInt
czytaInfinity
i szczęśliwie zauważa, żeI
ma 18 w bazie 19parseInt
ignoruje pozostałą część ciągu, ponieważ nie można go przekonwertować.Zauważ, że uzyskasz wynik dla dowolnej bazy
>= 19
, ale nie dla baz poniżej. W przypadku zasad>= 24
otrzymasz większy wynik, ponieważn
w tym momencie staje się prawidłową cyfrą.źródło
parseInt
akceptuje 36, ponieważ w alfabecie angielskim jest 26 liter, a konwencja polega na użyciu cyfr, a następnie liter jako zestawu prawidłowych cyfr w danej bazie.Infinity
na"Infinity"
...Aby dodać do powyższych odpowiedzi:
parseInt jest przeznaczony do parsowania ciągów na liczby (wskazówka znajduje się w nazwie). W twojej sytuacji nie chcesz wcale analizować, ponieważ 1/0 jest już liczbą, więc jest to dziwny wybór funkcji. Jeśli masz numer (który robisz) i chcesz przekonwertować go na określoną bazę, powinieneś użyć toString z podstawką .
źródło
Aby dodać do powyższych odpowiedzi
parseInt(1/0,19)
jest równaparseInt("Infinity",19)
W obrębie 19 liczb podstawowych
0-9
iA-I
(or a-i)
są prawidłowymi liczbami. Tak więc z „Nieskończoności” pobieraI
bazę 19 i konwertuje na bazę 10, która staje się 18, a następnie próbuje pobrać następny znak, tj.n
Który nie jest obecny w bazie 19, więc odrzuca kolejne znaki (zgodnie z zachowaniem konwersji kodu javascript na liczbę )Tak więc, jeśli napiszesz
parseInt("Infinity",19)
LUBparseInt("I",19)
LUBparseInt("i",19)
wynik będzie taki sam, tj18
.Teraz, jeśli piszesz
parseInt("I0",19)
wynik będzie342
jakI X 19 (the base)^1 + 0 X 19^0
=18 X 19^1 + 0 X 19^0
=18 X 19 + 0 X 1
=342
Podobnie
parseInt("I11",19)
spowoduje6518
to znaczy
źródło