왜 parseInt(8,3) == NaN과 parseInt(16,3) == 1일까요?
나는 이것을 읽고 있지만 구문 분석에 쓰여 있는 것이 혼란스럽습니다.기수 인수 장을 사용한 Int
왜 그럴까요?parseInt(8, 3)
→NaN
그리고.parseInt(16, 3)
→1
?
AFAIK 8과 16은 3진수가 아닙니다.parseInt(16, 3)
돌아와야 합니다NaN
너무
이것은 사람들이 그것에 대해 알고 있을 때에도 항상 걸려 넘어지는 것입니다. :-) 당신은 같은 이유로 이것을 보고 있습니다.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")
이라10
그x
무시됩니다.선택적 기수(숫자 기반) 인수를 지원하므로,parseInt("15", 16)
이라21
(15
16진수로기수가 없는 경우 문자열이 다음으로 시작하지 않는 한 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+], 일부 구현에서는 선두를 처리하기 위해 이를 확장합니다.0
8진수(엄격 모드는 아님).+"10x"
이라NaN
x
무시되지 않습니다.+"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
'programing' 카테고리의 다른 글
MySQL에서 varchar에 대해 255개가 아닌 다른 길이를 선택해야 하는 이유는 무엇입니까? (0) | 2023.07.29 |
---|---|
부트스트랩에서 발견되지 않은 오류가 발생함: 부트스트랩의 JavaScript에 jQuery가 필요함 (0) | 2023.07.29 |
파일 또는 어셈블리 'Oracle'을 로드할 수 없습니다.DataAccess' 또는 해당 종속성 중 하나입니다.잘못된 형식의 프로그램을 로드하려고 했습니다. (0) | 2023.07.29 |
jquery 중지 하위 이벤트 트리거링 (0) | 2023.07.29 |
1452 - 하위 행을 추가하거나 업데이트할 수 없습니다. (0) | 2023.07.29 |