JSLint에 "기수 매개 변수 누락"이 표시됩니다.


538

이 JavaScript 코드에서 JSLint를 실행했으며 다음과 같이 말했습니다.

32 행 문자 30 문제점 : 기수 매개 변수가 누락되었습니다.

이것은 문제의 코드입니다.

imageIndex = parseInt(id.substring(id.length - 1))-1;

여기서 무엇이 잘못 되었습니까?

답변:


967

항상 parseInt로 기수를 전달하는 것이 좋습니다.

parseInt(string, radix)

십진수의 경우-

parseInt(id.substring(id.length - 1), 10)

기수 매개 변수를 생략하면 JavaScript는 다음을 가정합니다.

  • 문자열이 "0x"로 시작하면 기수는 16 (16 진수)입니다.
  • 문자열이 "0"으로 시작하면 기수가 8 (8 진수)입니다. 이 기능은 더 이상 사용되지 않습니다
  • 문자열이 다른 값으로 시작하면 기수가 10 (10 진수)입니다

( 참조 )


7
그 소리에서 기본값은 10입니다. 0x 또는 0으로 시작하지 않으면 기본값은 기수 10입니다. 그러나 기수 값이 기본값이더라도 기수를 지정하는 것이 가장 좋습니다. "this"의 정의를 array.map 함수에 지정합니다.
molson504x

81
논리에 의해 기수 인수 자체의 기수를 나타내는 세 번째 매개 변수가 있어야합니다
Nishant

6
다른 논평자와 동의하십시오. 기본값이 10 일 때 기수 값을 제공하는 것이 좋은 이유는 무엇입니까? 이것은 일반적인 규칙을 무시합니다.
Richard Clayton

9
보풀로 10을 Redundant radix parameter
더하면

2
@Nishant : radix인수는 숫자 값의 문자열 표현이 아니라 숫자 값이므로 지정할 기수가 없습니다.
tokland

79

이 경고를 피하려면 다음을 사용하십시오.

parseInt("999", 10);

다음과 같이 교체 할 수 있습니다.

Number("999");


parseInt와 Number의 동작서로 다르지만 경우에 따라 하나가 다른 것을 대체 할 수 있습니다.


4
parseInt와 사이에 큰 성능 차이가 있습니다 Number. 다음은 오래된 성능 테스트 입니다.
Josh Unger

3
크롬 77 : Number()보다 빠르게 6 배입니다parseInt()
ZANON

1
이것은 잘 작동하는 깨끗한 용액입니다.
thanos.a

43

나는 질문에 올바르게 대답하지는 않지만 왜 기수를 지정 해야하는지 분명히하는 것이 합리적이라고 생각합니다 .

MDN 문서에서 다음을 읽을 수 있습니다.

기수가 정의되지 않거나 0 (또는 부재) 인 경우 JavaScript는 다음을 가정합니다.

  • [...]
  • 입력 문자열이 "0"으로 시작하면 기수는 8 (8 진수) 또는 10 (10 진수)입니다. 어떤 기수가 선택되는지는 구현에 따라 다릅니다. ECMAScript 5는 10 (10 진수)이 사용되도록 지정하지만 모든 브라우저에서 아직이 기능을 지원하지는 않습니다. 따라서 parseInt를 사용할 때는 항상 기수를 지정하십시오.
  • [...]

출처 : MDN parseInt ()


1
예. 그러나 Typescript 컴파일러가 삽입하므로 왜 귀찮게해야합니까?
Spock

2
@Spock TSLint가 존재하지 않는다고 불평하기 때문에. 그리고 우리가 가서 토끼 구멍 아래로 ...
msanford

예, 사실입니다. 그래서이 보푸라기 규칙을 비활성화합니다. OPTIONAL 매개 변수가 보푸라기 불만을 트립하는 이유를 여전히 이해하지 못합니다. oh well
Spock

4
@Spock 독자 혼란을 제거하고 예측 가능한 동작을 보장하려면 항상이 매개 변수를 지정하십시오. 기수가 지정되지 않은 경우 다른 구현으로 다른 결과가 생성되며 일반적으로 기본값은 10입니다. 참조
Andrew Lam

27

해당 테스트를 건너 뛰려면이 규칙을 해제 할 수 있습니다.

끼워 넣다:

radix: false

파일 의 " rules"속성 아래tslint.json

이 예외를 이해하지 못하면 그렇게하지 않는 것이 좋습니다.


1
코드가 기수없이 잘 실행되기 때문에 이것을 사용할 것입니다
William

22

JS 파일 위에 다음을 추가하면 JSHint가 기수 경고를 억제하도록 지시합니다.

/*jshint -W065 */

참조 : http://jshint.com/docs/#options


2
이것은 어떤 jshint 옵션에 해당합니까? SublimeLint를 사용하여 편집기에서 jshint를 실행하고 있으며 옵션의 해시 만 필요합니다. 설정에 대한 값 쌍이므로 "-W065"제안을 적용 할 수 없습니다.
Dihedral

5
"-W065": true예를 들어 .jshintrc파일 에서을 사용할 수 있습니다 .
alexfernandez

29
-1 제발하지 말고 파싱하려는 기수를 추가하십시오
Juan Mendes

언어를보다 강력하게 입력할수록 컴파일러 최적화의 기회가 많아 지므로 경고가 발생합니다.
HoldOffHunger

3
현대 JS에서 기수를 추가하는 IMO는 실제로 함수가 수행하는 작업을 더 명확하게 만듭니다. 함수 서명을 모르는 경우 기본값이 예상되는 위치에 있습니다. 기수를 지정해야한다는 것은 말이되지 않습니다.
Charles Offenbacher

5

+ foo를 사용하여 문자열을 변환하여 해결했습니다.

가독성 (더러운 수정)에는 좋지 않습니다.

console.log( +'1' )
// 1 (int)

3

parseInt 줄 바로 위에이 줄을 추가 할 수도 있습니다.

// eslint-disable-next-line

그러면 다음 줄에 대한 eslint 검사가 비활성화됩니다. 한두 줄만 건너 뛰어야하는 경우이 옵션을 사용하십시오.


2

parseInt ()는 두 개의 인수를 가지므로 기수 자리에 빈 문자열을 넣으십시오.

parseInt (문자열, 기수);

string 구문 분석 할 값입니다. 문자열 인수가 문자열이 아닌 경우 ToString 추상 연산을 사용하여 문자열로 변환됩니다. 문자열 인수의 선행 공백은 무시됩니다.

기수 위에서 언급 한 문자열의 기수 (수치 체계의 밑)를 나타내는 2에서 36 사이의 정수. 사람이 일반적으로 사용하는 10 진수 시스템에 10을 지정하십시오. 독자 혼란을 제거하고 예측 가능한 동작을 보장하려면 항상이 매개 변수를 지정하십시오. 기수가 지정되지 않은 경우 구현에 따라 결과가 다르며 일반적으로 기본값은 10입니다.

이미지 인덱스 = parseInt (id.substring (id.length-1))-1;
imageIndex = parseInt(id.substring(id.length - 1), '')-1;


2

.eslintrc에 사용자 지정 규칙을 추가하기 만하면 "radix": "off" 됩니다. 그러면이 eslint unnesesery 경고가 발생하지 않습니다. 이것은 eslint linter를위한 것입니다.


1

ECMAScript 5 이전에는 parseInt ()도 8 진 리터럴을 자동 감지하여 많은 개발자가 선행 0을 무시한다고 가정했기 때문에 문제를 일으켰습니다.

그래서 대신 :

var num = parseInt("071");      // 57

이 작업을 수행:

var num = parseInt("071", 10);  // 71

var num = parseInt("071", 8);

var num = parseFloat(someValue); 

참고


0

substring사용할 수 있는 함수를 호출하는 대신.slice()

    imageIndex = parseInt(id.slice(-1)) - 1;

여기서 slice에서 -1은 마지막 인덱스에서 슬라이스를 시작 함을 나타냅니다.

감사.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.