IT

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

lottoking 2020. 3. 24. 00:00
반응형

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을 반환하지합니다. 좋든 싫든, 이것은 의도적으로 설계된 것 입니다.

해결 방법은 무엇입니까?

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


최신 정보:

JavaScript 표준 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)}

십진법은 어떻습니까?

('09'-0) === 9  // true

('009'-0) === 9 // true

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 링크

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


parseInt로 이미 많은 코딩을 수행했고 모든 것에 ", 10"을 추가하고 싶지 않은 경우, 기본 10을 기본값으로 설정하기 위해 함수를 재정의하면됩니다.

window._oldParseInt = window.parseInt;
window.parseInt = function(str, rad) {
    if (! rad) {
        return _oldParseInt(str, 10);
    }
    return _oldParseInt(str, rad);
};

나중에 독자에게 혼란을 줄 수 있으므로 parseInt10 () 함수를 만드는 것이 더 자명 할 수 있습니다. 개인적으로 저는 항상 "10"을 추가하는 것보다 간단한 기능을 사용하는 것을 선호합니다. 실수의 가능성이 더 커집니다.

참고 URL : https://stackoverflow.com/questions/850341/how-do-i-work-around-javascripts-parseint-octal-behavior

반응형