2016-08-25 3 views
190

나는 this을 읽고 있어요하지만 난 기수 인수 장으로 으로 parseInt에 기록 된 무엇에 의해 혼란 스러워요왜 parseInt (8,3) == NaN 및 parseInt (16,3) == 1입니까?

table of parseInt(_, 3) outcomes

왜이 NaNparseInt(16, 3)1parseInt(8, 3)인가?

AFAIK 8 및 16 BASE-3하지 않는 번호를, 그들은 그것에 대해 알고있는 경우에도 그렇게 parseInt(16, 3)이 모든 시간이 지남에 너무

the first ten base-3 natural numbers

+4

고정 유형 지정 (또는 적어도 정수를 문자열로 암시 적으로 변환하지 않음)으로 해결할 수있는 또 다른 문제는 다음과 같습니다. P – Navin

+4

@Navin이 것은 정적 대 동적 입력과는 아무 관련이 없습니다. 여기에있는 문제는 강한 타이핑에 비해 약합니다. –

+12

이 질문의 제목을 보았을 때 나는 "나 때문에 아마 loljavascript"라고 생각했다. 대답을 보니 내 본능이 기본적으로 옳았다 고 판단됩니다. –

답변

372

이 뭔가 사람들이 여행을 NaN를 반환해야합니다. :-) 같은 이유에서 이것을보고있는 중 parseInt("1abc")은 1을 반환합니다 : parseInt은 첫 번째 유효하지 않은 문자에서 멈추고 그 지점에있는 문자를 반환합니다. 구문 분석 할 유효한 문자가 없으면 NaN을 반환합니다.

parseInt(8, 3)은 "8"을 details in the spec 문자열로 변환한다는 점에 유의하십시오. 그러나 기본 3에서 한자리 숫자는 단지 0, 12입니다. "9"을 8 진수로 파싱하는 것과 같습니다. 유효한 문자가 없으므로 문자는 NaN입니다.

parseInt(16, 3)

는 않는다는 1을 분석 할 수 있기 때문에 기부 (3)에 "16" 구문 분석을 요구하고, 그것은 그것을 분석 할 수 없기 때문에 그런 다음 6에서 정지한다. 따라서 1을 반환합니다.

이 질문은 많은 관심을 받고 검색 결과에서 높은 순위를 할 수 있기 때문에

, 여기에 자신의 다양한 특이성 및 응용 프로그램, 자바 스크립트의 숫자를 문자열로 변환하는 옵션의 개요가있어 (내 다른 답변에서 해제 여기) SO에 :

  • parseInt(str[, radix]) - 마지막에 추가 문자를 무시하고, 전체 (정수) 번호로는 할 수있는 문자열의 시작 부분만큼을 변환합니다. 따라서 parseInt("10x")10입니다. x은 무시됩니다. 선택적인 기수 (수) 인수를 지원하므로 parseInt("15", 16)21 (16 진수의 15)입니다. 기수가없는 경우, 문자열이 0x (또는 0X)으로 시작하지 않는 한 10 진수로 가정합니다.이 경우 문자열을 건너 뛰고 16 진수로 가정합니다. (일부 브라우저는 0으로 시작하는 문자열을 8 진수로 처리하는 데 사용되었지만 해당 동작이 지정되지 않았고 ES5 사양에서 specifically disallowed이었습니다. 구문 분석 가능 숫자가없는 경우는 NaN을 반환합니다.

  • parseFloat(str) - 마찬가지로 parseInt이지만 부동 소수점 숫자는 소수점만을 지원합니다. 다시 문자열의 여분의 문자는 무시되므로 parseFloat("10.5x")10.5입니다 (x는 무시 됨). 십진수 만 지원되므로 parseFloat("0x15")0입니다 (구문 분석이 x에서 끝나기 때문에). 파싱 ​​할 수있는 자릿수가없는 경우 NaN을 반환합니다.

  • 유니어 +. 0x 프리픽스 = 헥스; 0o 프리픽스 = 진수 [ES2015 +] - +str(예를 들면, 암시 적 변환)는 (단 자리와 소수점 = 진 부동 소수점 및 JavaScript의 표준 번호 표기를 사용하여 숫자로 전체 문자열로 변환; 일부 구현은 선도 형 0을 8 진수로 처리하지만 엄격 모드에서는 처리하지 않습니다. +"10x"x이 아니기 때문에이 무시되었으므로 NaN입니다. +"10"10, +"10.5"10.5, +"0x15"21, +"0o10"8 [ES2015 +]이다. gotcha가 있음 : +""0이며, 예상대로 NaN이 아닙니다.

  • Number(str) - 정확히 암시 적 변환과 같습니다 (예 : 위의 단항 +과 유사). 그러나 일부 구현에서는 속도가 느립니다. (그것은 중요 할 가능성이 높습니다하지 않는 것이.) the doc에서 parseInt이 문자열을 사용합니다

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

    것과 같은 이유로

+8

그래서'parseInt'는 첫 번째 인수에서'toString'을 먼저 사용합니까? 그것은 말이 될 것입니다. – evolutionxbox

+15

@evolutionxbox : 네,'parseInt' 알고리즘의 첫 번째 단계입니다 : http://www.ecma-international.org/ecma-262/7.0/index.html#sec-parseint-string-radix –

+4

' 123e-2'는 먼저'1.23 '이되기 때문에'1'을주고, 소수점에서 파싱을 멈 춥니 다? – ilkkachu

54

. 그리고

문자열 경우 다음은

그래서 168, 또는 '1foobar' 먼저 문자열로 변환 문자열로 변환, 문자열이 아닌. parseInt이 지정된 기수에서 숫자가 아닌 문자가 발생하면

그런 다음

, 그것은 어디 수는 최대 변환 의미 IT와 계속되는 모든 문자

을 무시합니다. 6, 8foobar은 무시되며 이전 내용 만 변환됩니다. 아무것도없는 경우 NaN이 리턴됩니다.