JavaScript 에서 성가신 문제가 있습니다 있습니다.
> parseInt(1 / 0, 19)
> 18
parseInt
함수 가 왜 반환 18
됩니까?
JavaScript 에서 성가신 문제가 있습니다 있습니다.
> parseInt(1 / 0, 19)
> 18
parseInt
함수 가 왜 반환 18
됩니까?
답변:
의 결과는 1/0
입니다 Infinity
.
parseInt
첫 번째 인수를 문자열로 취급합니다. 이는 먼저 문자열이 생성됨을 의미 Infinity.toString()
합니다 "Infinity"
. 따라서 변환을 요청한 것과 동일하게 작동합니다."Infinity"
기본 19에서 십진수 .
밑이 19 인 숫자와 소수 값은 다음과 같습니다.
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
다음에 발생하는 일은 parseInt
입력 "Infinity"
을 스캔하여 구문 분석 할 수있는 부분을 찾은 후 첫 번째 부분을 승인 한 후 중지합니다 I
( n
기본 19의 유효한 숫자가 아니기 때문에 ).
따라서 마치 parseInt("I", 19)
위의 표에서 십진수 18로 변환하는 것처럼 호출 한 것처럼 동작 합니다.
parseInt('Infini',24)
.
n
자릿수도 유효한 숫자이기 때문에 실제로 끝납니다 parseInt("Infini", 24)
.
이벤트 순서는 다음과 같습니다.
1/0
~에 평가하다 Infinity
parseInt
기본 19의 18 인 Infinity
메모를 읽고 행복하게 읽습니다.I
parseInt
문자열을 변환 할 수 없으므로 나머지 문자열을 무시합니다.어떤 base에 대해서도 결과를 얻을 수 >= 19
있지만 그 아래 에있는 base 는 그렇지 않습니다. bases의 >= 24
경우 n
해당 지점에서 유효한 숫자가되므로 더 큰 결과를 얻을 수 있습니다 .
parseInt
영어 알파벳에는 26자가 있기 때문에 가장 큰 기준 은 36입니다. 규칙은 숫자를 사용하고 주어진 기준에서 유효한 숫자 집합으로 문자를 사용하는 것입니다.
Infinity
을 제안 할 수 있습니다 "Infinity"
.
위의 답변에 추가하려면 다음을 수행하십시오.
parseInt는 문자열을 숫자로 구문 분석하기위한 것입니다 (단서는 이름에 있습니다). 귀하의 상황에서는 1/0이 이미 숫자이므로 구문 분석을 전혀 원하지 않으므로 기능의 이상한 선택입니다. 숫자가 있고 특정 기준으로 변환하려면 대신 기수와 함께 toString을 사용해야 합니다.
var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"
위의 답변에 추가하려면
parseInt(1/0,19)
에 해당 parseInt("Infinity",19)
기본 19 자리 이내 0-9
이며 A-I
(or a-i)
유효한 숫자입니다. 따라서 "무한대" I
에서 기본 19를 취하고 기본 10으로 변환하여 18이됩니다. 그러면 다음 문자를 가져 오려고합니다.n
기본 19에없는 (따라서 자바 스크립트의 문자열을 숫자로 변환하는 동작에 따라) )
따라서 parseInt("Infinity",19)
OR parseInt("I",19)
OR 를 쓰면 parseInt("i",19)
결과는 동일 18
합니다.
당신이 쓰는 지금, 만약 parseInt("I0",19)
결과가 될 것 342
으로 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
마찬가지로 parseInt("I11",19)
결과는6518
즉
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
도움 이 될 수 있습니다.