programing

왜 parseInt(8,3) == NaN과 parseInt(16,3) == 1일까요?

css3 2023. 7. 29. 08:47

왜 parseInt(8,3) == NaN과 parseInt(16,3) == 1일까요?

나는 이것을 읽고 있지만 구문 분석에 쓰여 있는 것이 혼란스럽습니다.기수 인수 장을 사용한 Int

table of parseInt(_, 3) outcomes

왜 그럴까요?parseInt(8, 3)NaN그리고.parseInt(16, 3)1?

AFAIK 8과 16은 3진수가 아닙니다.parseInt(16, 3)돌아와야 합니다NaN너무

the first ten base-3 natural numbers

이것은 사람들이 그것에 대해 알고 있을 때에도 항상 걸려 넘어지는 것입니다. :-) 당신은 같은 이유로 이것을 보고 있습니다.parseInt("1abc")반환 횟수 1:parseInt첫 번째 잘못된 문자에서 중지되고 해당 시점에 있는 모든 문자를 반환합니다.구문 분석할 올바른 문자가 없으면 반환됩니다.NaN.

parseInt(8, 3)뜻은 "지혜적"입니다."8"기본 3"에서 (숫자를 변환합니다.)8문자열로, 세부 정보는 사양에 있습니다.하지만 3번 베이스에서, 한 자리 숫자는0,1,그리고.2그것은 그것을 파싱하라고 요구하는 것과 같습니다."9"팔분의 일의유효한 문자가 없었기 때문에, 당신은.NaN.

parseInt(16, 3)그것을 구문 분석하도록 요청하는 것입니다."16"3루에서그것은 그것을 구문 분석할 수 있기 때문에.1그래요, 그리고 나서 그것은 그 곳에서 멈춥니다.6왜냐하면 그것은 그것을 구문 분석할 수 없기 때문입니다.그래서 그것은 돌아옵니다.1.


이 질문은 많은 관심을 받고 있고 검색 결과에서 높은 순위를 차지할 수 있기 때문에 다음은 다양한 고유성과 응용 프로그램과 함께 JavaScript에서 문자열을 숫자로 변환하는 옵션에 대한 요약입니다(SO에 대한 다른 답변에서 들어옴).

  • parseInt(str[, radix])문자열의 시작 부분을 끝에 있는 추가 문자를 무시한 채 전체(정수) 숫자로 변환합니다.parseInt("10x")이라10x무시됩니다.선택적 기수(숫자 기반) 인수를 지원하므로,parseInt("15", 16)이라21(1516진수로기수가 없는 경우 문자열이 다음으로 시작하지 않는 한 10진수로 가정합니다.0x(또는)0X), 이 경우 이를 생략하고 16진수로 가정합니다. (일부 브라우저는 문자열을 8진수로 처리하는 데 사용되며, 해당 동작은 지정되지 않았으며 ES5 사양에서 특별히 허용되지 않았습니다.)돌아온다NaN구문 분석 가능한 숫자가 없는 경우.

  • parseFloat(str)좋아요parseInt그러나 부동 소수점 숫자를 사용하고 10진수만 지원합니다.다시 문자열의 추가 문자가 무시됩니다.parseFloat("10.5x")이라10.5(그x무시됨).소수만 지원되므로,parseFloat("0x15")이라0(파싱이 다음에서 끝나기 때문에)x) 반환합니다.NaN구문 분석 가능한 숫자가 없는 경우.

  • 유니아리+,예.+str(예: 암시적 변환) 부동 소수점과 JavaScript의 표준 숫자 표기법(숫자와 소수점 = 소수점)을 사용하여 전체 문자열을 숫자로 변환합니다.0x, 접사 = 16수;0o접두사 = 8진수 [ES2015+], 일부 구현에서는 선두를 처리하기 위해 이를 확장합니다.08진수(엄격 모드는 아님).+"10x"이라NaNx무시되지 않습니다.+"10"이라10,+"10.5"이라10.5,+"0x15"이라21,+"0o10"이라8[ES2015+].갓챠가 있습니다.+""이라0,것은 아니다.NaN예상하신 대로

  • Number(str) 변환( 단항 )과 정확히 같습니다.+일부 구현에서는 속도가 느려집니다.(중요한 것은 아닙니다.)

같은 이유로

>> parseInt('1foobar',3)
<- 1

그 문서에서,parseInt끈을 잡습니다. 그리고

문자열이 문자열이 아닌 경우 문자열로 변환됩니다.

그렇게16,8또는'1foobar'먼저 문자열로 변환됩니다.

그리고나서

한다면parseInt합니다.

즉, 가능한 곳으로 변환된다는 뜻입니다.6,8,그리고.foobar무시되고 이전 항목만 변환됩니다. 아무것도, 만약아없다면도것무,NaN반환됩니다.

/***** Radix 3: Allowed numbers are [0,1,2] ********/
parseInt(4, 3); // NaN - We can't represent 4 using radix 3 [allowed - 0,1,2]

parseInt(3, 3); // NaN - We can't represent 3 using radix 3 [allowed - 0,1,2]

parseInt(2, 3); // 2   - yes we can !

parseInt(8, 3); // NaN - We can't represent 8 using radix 3 [allowed - 0,1,2]

parseInt(16, 3); // 1  
//'16' => '1' (6 ignored because it not in [0,1,2])    

/***** Radix 16: Allowed numbers/characters are [0-9,A-F] *****/ 
parseInt('FOX9', 16); // 15  
//'FOX9' => 'F' => 15 (decimal value of 'F')
// all characters from 'O' to end will be ignored once it encounters the out of range'O'
// 'O' it is NOT in [0-9,A-F]

몇 가지 더 예:

parseInt('45', 13); // 57
// both 4 and 5 are allowed in Radix is 13 [0-9,A-C]

parseInt('1011', 2); // 11 (decimal NOT binary)

parseInt(7,8); // 7
// '7' => 7 in radix 8 [0 - 7]

parseInt(786,8); // 7 
// '78' => '7' => 7 (8 & next any numbers are ignored bcos 8 is NOT in [0-7])

parseInt(76,8); // 62 
// Both 7 & 6 are allowed '76' base 8 decimal conversion is 62 base 10 

언급URL : https://stackoverflow.com/questions/39147108/why-is-it-that-parseint8-3-nan-and-parseint16-3-1