이전에 JavaScript에서 숫자형을 판별하는 다양한 방법을 기록했습니다. 이번 글에서는 정수형(Integer)을 판별하는 방법을 살펴보겠습니다.
JavaScript는 정수와 부동 소수점 숫자를 구분하지 않습니다. 모든 숫자는 내부적으로 Java의 double 유형과 동일한 64비트 부동 소수점 형식으로 표현됩니다. 그러나 배열 인덱싱, 비트 연산 등 실제 연산은 32비트 정수를 기반으로 합니다.
방법 1: 나머지 연산자를 사용하여
결정
모든 정수는 1로 나누어집니다. 즉 나머지는 0입니다. 이 규칙을 사용하여 정수인지 여부를 확인합니다.
함수 isInteger(obj) {
반환 obj%1 === 0
}
isInteger(3) // 참
isInteger(3.3) // false
위 출력은 이 함수가 사용하기 매우 쉽지만 문자열 및 일부 특수 값에 대해서는 무력하다는 것을 보여줍니다
isInteger('') // 참
isInteger('3') // 참
isInteger(true) // 참
isInteger([]) // 참
빈 문자열, 문자열 유형 숫자, 부울 true 및 빈 배열의 경우 True가 반환되는데 이는 실제로 허용되지 않습니다. 이러한 유형의 내부 변환 세부 사항에 관심이 있으시면 JavaScript의 이상한 false 값
을 참조하세요.
따라서 먼저 유형을 추가하는 등 객체가 숫자인지
확인해야 합니다.
함수 isInteger(obj) {
반환 유형 obj === 'number' && obj%1 === 0
}
isInteger('') // 거짓
isInteger('3') // 거짓
isInteger(true) // 거짓
isInteger([]) // 거짓
뭐, 이게 더 완벽해요.
2. Math.round, Math.ceil, Math.floor를 활용하여 판단하세요
정수는 반올림 후에도 여전히 그 자체와 동일합니다. 이 기능을 사용하여 정수인지 확인하는 Math.floor 예시는 다음과 같습니다
함수 isInteger(obj) {
Math.floor(obj) === obj
반환
}
isInteger(3) // 참
isInteger(3.3) // 거짓
isInteger('') // 거짓
isInteger('3') // 거짓
isInteger(true) // 거짓
isInteger([]) // 거짓
이는 문자열, true 및 []를 직접 차단하며 코드의 양은 이전 함수보다 적습니다.
3. ParseInt로 판단
함수 isInteger(obj) {
ParseInt(obj, 10) === obj
반환
}
isInteger(3) // 참
isInteger(3.3) // 거짓
isInteger('') // 거짓
isInteger('3') // 거짓
isInteger(true) // 거짓
isInteger([]) // 거짓
아주 좋은데 단점이 있어요
isInteger(1000000000000000000000) // 거짓
실제로 false를 반환했는데 이는 불합리합니다. 그 이유는parseInt가 정수를 구문 분석하기 전에 첫 번째 인수를 문자열로 구문 분석하도록 강제하기 때문입니다. 숫자를 정수로 변환하는 이 방법은 좋은 선택이 아닙니다.
4. 비트 연산을 통한 판단
함수 isInteger(obj) {
반환(obj | 0) === obj
}
isInteger(3) // 참
isInteger(3.3) // 거짓
isInteger('') // 거짓
isInteger('3') // 거짓
isInteger(true) // 거짓
isInteger([]) // 거짓
이 기능은 매우 훌륭하고 효율적입니다. 하지만 위에서 언급한 것처럼 비트 연산은 32비트 이내의 숫자만 처리할 수 있고, 과 같이 32비트를 초과하는 숫자에는 아무것도 할 수 없다는 단점이 있습니다.
isInteger(Math.pow(2, 32)) // 32자리를 초과하는 숫자는 false를 반환합니다.
물론 대부분의 경우 그렇게 큰 숫자를 사용하지 않습니다.
5. ES6에서는 Number.isInteger를 제공합니다
Number.isInteger(3) // true
Number.isInteger(3.1) // false
Number.isInteger('') // 거짓
Number.isInteger('3') // 거짓
Number.isInteger(true) // 거짓
Number.isInteger([]) // 거짓
현재 최신 Firefox와 Chrome에서는 이미 이를 지원하고 있습니다.