나는 이것을 읽고 있지만 parseInt에 기수 인수 장으로 쓰여진 것에 혼동됩니다.
왜이다 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"
base 3의 구문 분석”을 의미 합니다 (숫자 8
를 문자열 로 변환합니다 . spec의 세부 사항 ). 그러나 기본 3에서, 한 자리 숫자는이다 0
, 1
하고 2
. "9"
8 진수 로 파싱하도록 요청하는 것과 같습니다 . 거기 없기 때문에 더 유효한 문자는, 당신은 있어요 NaN
.
parseInt(16, 3)
"16"
기본 3에서 구문 분석 을 요청하고 있습니다. 구문 분석 할 수 있기 때문에 구문 분석 할 수 없기 때문에 1
중단됩니다 6
. 따라서를 반환합니다 1
.
이 질문은 많은 관심을 끌고 있으며 검색 결과에서 높은 순위를 매길 수 있으므로 다음은 다양한 특성과 응용 프로그램 (여기서 내 대답에 대한 다른 답변)에서 JavaScript의 문자열을 숫자로 변환하는 옵션에 대한 설명입니다.
-
parseInt(str[, radix])
-문자열의 시작 부분을 가능한 한 정수 (정수)로 변환하고 끝에 추가 문자를 무시합니다. 그래서parseInt("10x")
입니다10
; 는x
무시됩니다. 선택 사양 기수 (기수) 인수를 지원하므로parseInt("15", 16)
입니다21
(15
진수에서). 기수가없는 경우 문자열이0x
(또는0X
)로 시작하지 않으면 소수를 가정하고 ,이 경우에는 생략하고 16 진을 가정합니다. (일부 브라우저0
는 8 진수로 시작하는 문자열을 처리하는 데 사용되었습니다 . 해당 동작은 지정되지 않았 으며 ES5 사양에서 구체적으로 허용되지 않았습니다 .)NaN
구문 분석 가능한 숫자가 없으면 반환 합니다. -
parseFloat(str)
-와parseInt
같지만 부동 소수점 숫자를 수행하고 소수만 지원합니다. 다시 문자열에 추가 문자는 너무 무시하는parseFloat("10.5x")
것입니다10.5
합니다 (이x
무시됩니다). 단지 소수점이 지원되기 때문에,parseFloat("0x15")
이다0
(상기 끝을 구문 분석 때문에x
).NaN
구문 분석 가능한 숫자가없는 경우 반환 합니다. -
단항
+
예+str
– (예를 들어, 암시 적 변환) 개종자 전체 , 부동 소수점 및 JavaScript의 표준 번호 표기 (단 자리와 소수점 포인트 = 소수점 사용 번호 문자열0x
프리픽스 = 헥스;0o
프리픽스 = 진수 [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
에서 doc 후 , parseInt
문자열을 사용합니다. 과
string 이 문자열 이 아닌 경우 문자열 로 변환됩니다
그래서 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