[javascript] JavaScript의 구문 분석 8 진 동작을 어떻게 해결합니까?

JavaScript에서 다음을 실행하십시오.

parseInt('01'); //equals 1
parseInt('02'); //equals 2
parseInt('03'); //equals 3
parseInt('04'); //equals 4
parseInt('05'); //equals 5
parseInt('06'); //equals 6
parseInt('07'); //equals 7
parseInt('08'); //equals 0 !!
parseInt('09'); //equals 0 !!

난 그냥 자바 스크립트가 앞에 0이 표시 생각하는 것을 어렵게 배운 진수 정수를 , 더 있기 때문에 "8"또는 "9"기본-8, 함수는 0을 반환하지합니다. 좋든 싫든, 이것은 의도적으로 설계된 것 입니다.

해결 방법은 무엇입니까?

참고 : 완전성을 위해 솔루션을 게시하려고하지만 싫어하는 솔루션이므로 다른 답변을 게시하십시오.


최신 정보:

자바 스크립트 표준 5 판 ( ECMA-262 )에는이 동작을 제거하는 주요 변경 사항이 도입되었습니다. 모질라는 글을 잘 쓴다 .



답변

이것은 간단한 해결책을 가진 일반적인 자바 스크립트입니다.

다음과 같이 base 또는 ‘radix’를 지정하십시오 .

parseInt('08',10); // 8

Number 를 사용할 수도 있습니다 .

Number('08'); // 8


답변

값이 부호있는 32 비트 정수 범위에 있음 을 알고 있으면 ~~x모든 시나리오에서 올바른 작업을 수행합니다.

~~"08" === 8
~~"foobar" === 0
~~(1.99) === 1
~~(-1.99)  === -1

이진 ( ~)을 찾지 않으면 스펙은 Int32 로의 명백한 변환을 수행하고 NaN값을 0 으로 강제하도록 지정된 인수에 대해 “ToInt32″변환이 필요합니다 .

예, 이것은 엄청나게 해킹 적이지만 매우 편리합니다 …


답변

로부터 으로 parseInt 문서 , 밑이 10 인 지정 옵션 기수 인수를 사용합니다 :

parseInt('08', 10); //equals 8
parseInt('09', 10); //equals 9

이것은 나를 혼란스럽고 혼란스럽고 장황하게 표현합니다 (실제로 모든 단일 구문 분석에서 추가 인수입니까?).


답변

function parseDecimal(s) { return parseInt(s, 10); }

편집 : 당신이 정말로 원하는 것을하기 위해 자신의 함수를 만드는 것은 parseInt () 호출에 항상 “, 10″을 추가하고 싶지 않다면 옵션 일뿐입니다. 비표준 기능이라는 단점이 있습니다. 많이 사용하면 더 편리하지만 다른 사람들에게는 더 혼란 스럽습니다.


답변

베이스를 지정하십시오.

var number = parseInt(s, 10);


답변

parseInt에 두 번째 매개 변수가 없으면 십진수로 가정하는 버전으로 바꾸는 것이 매우 좋지 않을까요? (참고-테스트되지 않음)

parseIntImpl = parseInt
parseInt = function(str, base){return parseIntImpl(str, base ? base : 10)}


답변

parseFloat 또는 parseInt를 사용하는 대신 단항 연산자 ( + )를 사용할 수도 있습니다.

+"01"
// => 1

+"02"
// => 2

+"03"
// => 3

+"04"
// => 4

+"05"
// => 5

+"06"
// => 6

+"07"
// => 7

+"08"
// => 8

+"09"
// => 9

그리고 좋은 측정을 위해

+"09.09"
// => 9.09

MDN 링크

단항 더하기 연산자는 피연산자 앞에 오며 피연산자로 평가되지만 숫자가 아닌 경우에는 피연산자로 변환하려고 시도합니다. 단항 부정 (-)도 숫자가 아닌 숫자를 변환 할 수 있지만, 단항 더하기는 숫자 에서 다른 연산을 수행하지 않기 때문에 무언가를 숫자로 변환하는 가장 빠르고 선호되는 방법입니다 .