Mam irytujący problem z JavaScript .
> parseInt(1 / 0, 19)
> 18
Dlaczego parseInt
funkcja powraca 18
?
Mam irytujący problem z JavaScript .
> parseInt(1 / 0, 19)
> 18
Dlaczego parseInt
funkcja powraca 18
?
Odpowiedzi:
Rezultatem 1/0
jest Infinity
.
parseInt
traktuje swój pierwszy argument jako ciąg znaków, co oznacza przede wszystkim, że Infinity.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:
Base 19 Base 10 (decimal)
---------------------------
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
a 10
b 11
c 12
d 13
e 14
f 15
g 16
h 17
i 18
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 pierwszej I
(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.
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 na Infinity
parseInt
czyta Infinity
i szczęśliwie zauważa, że I
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ą.
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ą .
var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"
Aby dodać do powyższych odpowiedzi
parseInt(1/0,19)
jest równa parseInt("Infinity",19)
W obrębie 19 liczb podstawowych 0-9
i A-I
(or a-i)
są prawidłowymi liczbami. Tak więc z „Nieskończoności” pobiera I
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)
LUB parseInt("I",19)
LUB parseInt("i",19)
wynik będzie taki sam, tj 18
.
Teraz, jeśli piszesz parseInt("I0",19)
wynik będzie 342
jak I 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
18 X 19^2 + 1 X 19^1 + 1 X 19^0
= 18 X 19^2 + 1 X 19^1 + 1 X 19^0
= 18 X 361 + 1 X 19 + 1 X 1
= 6498 + 19 + 1
= 6518
if
może pomóc.