JavaScript / isFinite()와 Number.isFinite()로 유한한 수 검사

isFinite(value)는 인수를 숫자로 변환한 결과가 유한한지 검사하는 전역 함수입니다. 값이 처음부터 숫자 자료형인지까지 확인하려면 자동 변환을 하지 않는 Number.isFinite(value)를 사용하세요. 두 함수 모두 NaN과 양·음의 무한대에는 false를 반환하지만, 숫자 문자열이나 빈 값에서는 결과가 달라질 수 있습니다.

유한한 숫자의 의미와 기본 문법

isFinite(12.5);    // true
isFinite(Infinity); // false
isFinite(-Infinity); // false
isFinite(NaN);       // false

유한하다는 것은 무한대가 아니면서 정상적인 Number 값이라는 뜻입니다. NaN은 Not-a-Number의 약자로, 계산이나 변환에서 정상적인 숫자 결과를 얻지 못했을 때 나타나는 특수한 값입니다. 원문 예제의 문자열 "Not a Number"와 JavaScript의 실제 값 NaN은 서로 다릅니다. 전자는 글자이고 후자는 Number 자료형에 속합니다.

전역 isFinite()는 숫자가 아닌 값을 먼저 숫자로 바꾸므로, 반환값이 true라고 해서 원래 값도 숫자였다는 뜻은 아닙니다. MDN의 isFinite() 문서는 이 변환 단계를 명시하고 있습니다.

Number.isFinite()와 결과 비교

입력값 isFinite() Number.isFinite()
0 true true
-3.5 true true
"12" true false
"" true false
null true false
Infinity false false
NaN false false

빈 문자열과 null은 전역 함수 안에서 숫자 0으로 변환될 수 있습니다. 따라서 “숫자를 입력했는지”를 검사하려는 코드에 isFinite()만 쓰면, 의도와 달리 비어 있는 입력까지 통과할 수 있습니다. Number.isFinite()는 실제 Number 값만 검사하므로 문자열을 받으면 그 내용이 숫자처럼 보여도 false입니다. MDN의 Number.isFinite() 설명에서 두 방식의 차이를 확인할 수 있습니다.

입력값을 변환 전후로 비교하는 전체 예제

아래 코드를 finite-number.html로 저장해 브라우저에서 여세요. 입력란의 값은 문자열이므로, 같은 입력을 원래 문자열 상태와 Number()로 변환한 뒤 각각 검사합니다. 앞뒤 공백만 있는 입력은 계산하기 전에 별도로 거릅니다.

<!doctype html>
<html lang="ko">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>isFinite와 Number.isFinite 비교</title>
</head>
<body>
<h1>유한한 숫자 검사</h1>
<label for="value">검사할 입력</label>
<input id="value" value="12.5">
<button id="check" type="button">검사</button>
<button id="restore" type="button">복원</button>
<pre id="output"></pre>
<script>
const input = document.getElementById("value");
const output = document.getElementById("output");
function check() {
  const raw = input.value.trim();
  if (raw === "") {
    output.textContent = "빈 입력은 받지 않습니다.";
    return;
  }
  const number = Number(raw);
  output.textContent = [
    `입력 자료형: ${typeof raw}`,
    `isFinite(raw): ${isFinite(raw)}`,
    `Number.isFinite(raw): ${Number.isFinite(raw)}`,
    `Number(raw): ${number}`,
    `Number.isFinite(number): ${Number.isFinite(number)}`
  ].join("\n");
}
document.getElementById("check").addEventListener("click", check);
document.getElementById("restore").addEventListener("click", () => {
  input.value = "12.5";
  check();
});
check();
</script>
</body>
</html>

처음 값 12.5에서 전역 isFinite(raw)는 true, Number.isFinite(raw)는 false입니다. 숫자로 변환한 뒤의 Number.isFinite(number)는 true가 됩니다. 검사하려는 대상의 자료형이 달라진 것이므로 같은 이름의 함수에서 서로 모순된 결과가 나온 것은 아닙니다.

입력을 abc로 바꾸면 변환 결과가 NaN이고, 마지막 검사는 false입니다. Infinity를 입력해도 유한한 숫자가 아니므로 통과하지 않습니다. 입력란을 비우면 빈 입력 안내가 나오며, ‘복원’으로 12.5를 다시 넣어 비교 조건을 되돌릴 수 있습니다. 예제는 JavaScript 숫자 변환의 차이를 보여 주는 것이며, 허용할 소수점 표기나 지수 표기 등 서비스의 입력 규칙은 별도로 정해야 합니다.

정수·양수·안전한 정수 검사는 별개입니다

Number.isFinite(1.5); // true
Number.isInteger(1.5); // false
Number.isFinite(-10);  // true

const amount = 12.5;
const positiveFinite = Number.isFinite(amount) && amount > 0;

유한성 검사만으로 정수, 양수, 지정 범위 안의 수라는 조건이 충족되지는 않습니다. 개수라면 정수 여부와 허용 범위를, 금액이라면 소수 처리 규칙을 함께 판단하세요. 매우 큰 정수는 유한하더라도 Number로 정확하게 표현하지 못할 수 있으므로, 정확한 정수 처리가 필요하면 Number.isSafeInteger() 같은 추가 기준을 검토해야 합니다.

또한 전역 함수는 숫자 변환 과정에서 일부 자료형에 오류를 낼 수 있습니다. 예를 들어 Symbol이나 BigInt를 일반 Number 변환 규칙으로 처리하려 하면 TypeError가 발생할 수 있습니다. 이미 숫자 자료형만 허용할 설계라면 Number.isFinite()로 검사 목적을 명확히 하고, 임의의 객체를 자동 변환하도록 두지 않는 편이 판단하기 쉽습니다.