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