isNaN() 전역 함수

isNaN() 전역 함수

isNaN()은 어떤 값이 NaN인지 판별하는 전역 함수입니다. 필요하다면 값을 먼저 숫자로 변환합니다. 다만 isNaN() 내부의 형 변환(coercion) 동작이 의외의 결과를 낼 수 있으므로, Number.isNaN()을 선호할 수 있습니다.

출처: isNaN() - MDN Web Docs

본문

개요

isNaN() 함수는 값이 NaN인지 판별하며, 필요시 값을 먼저 숫자로 변환합니다.

기본적인 사용 예는 다음과 같습니다.

function milliseconds(x) {
  if (isNaN(x)) {
    return "Not a Number!";
  }
  return x * 1000;
}

console.log(milliseconds("100F"));
// Expected output: "Not a Number!"

console.log(milliseconds("0.0314E+2"));
// Expected output: 3140

구문(Syntax)

isNaN(value)

매개변수

  • value — 테스트할 값입니다.

반환값 — 주어진 값이 숫자로 변환된 후 NaN이면 true, 그 외에는 false입니다.

설명(Description)

isNaN()은 전역 객체의 함수 프로퍼티입니다.

숫자 값에 대해 isNaN()은 그 숫자가 NaN 값인지 테스트합니다. isNaN() 함수의 인자가 Number 타입이 아니면 값은 먼저 숫자로 강제 변환되고, 그 결과 값이 NaN과 비교됩니다.

비-숫자 인자에 대한 isNaN()의 이 동작은 혼란스러울 수 있습니다! 예를 들어 빈 문자열은 0으로, 불리언은 0 또는 1로 강제 변환됩니다. 이 두 값 모두 직관적으로 "숫자가 아니지만", NaN으로 평가되지는 않으므로 isNaN()false를 반환합니다. 따라서 isNaN()은 "입력이 부동 소수점 NaN 값인가"라는 질문에도, "입력이 숫자가 아닌가"라는 질문에도 답하지 못합니다.

Number.isNaN()은 값이 숫자 NaN인지 여부를 테스트하는 더 신뢰할 수 있는 방법입니다. 또는 x !== x 표현식을 사용할 수 있으며, 두 해법 모두 전역 isNaN()을 신뢰할 수 없게 만드는 오탐(false positive)에 휘둘리지 않습니다. 값이 숫자인지 테스트하려면 typeof x === "number"를 사용하십시오.

isNaN() 함수는 "입력이 숫자 맥락에서 사용될 때 NaN과 기능적으로 동등한가"라는 질문에 답합니다. isNaN(x)false를 반환하면 수치 산술 표현식에서 xNaN이 아닌 유효한 숫자처럼 사용할 수 있습니다. isNaN(x)true를 반환하면 xNaN으로 강제 변환되어 대부분의 산술 표현식이 NaN을 반환하게 됩니다(NaN이 전파되기 때문). 예를 들어 이를 사용해 함수의 인자가 산술적으로 처리 가능한(숫자 "처럼" 사용 가능한)지 테스트하고, 숫자처럼 보이지 않는 값은 오류를 던지거나 기본값을 제공하는 식으로 처리할 수 있습니다.

참고: + 연산자는 숫자 덧셈과 문자열 연결을 모두 수행합니다. 따라서 isNaN()이 두 피연산자 모두에 대해 false를 반환해도 + 연산자는 여전히 문자열을 반환할 수 있습니다. 예를 들어 isNaN("1")false를 반환하지만 "1" + 1"11"을 반환합니다. 숫자를 다루고 있는지 확실히 하려면 값을 숫자로 강제 변환하고 Number.isNaN()으로 결과를 테스트하십시오.

예제

isNaN()NaN 값이 아니면서 동시에 숫자도 아닌 값들에 대해 true를 반환하는 방식을 주목하십시오.

isNaN(NaN); // true
isNaN(undefined); // true
isNaN({}); // true

isNaN(true); // false
isNaN(null); // false
isNaN(37); // false

// Strings
isNaN("37"); // false: "37" is converted to the number 37 which is not NaN
isNaN("37.37"); // false: "37.37" is converted to the number 37.37 which is not NaN
isNaN("37,5"); // true
isNaN("123ABC"); // true: Number("123ABC") is NaN
isNaN(""); // false: the empty string is converted to 0 which is not NaN
isNaN(" "); // false: a string with spaces is converted to 0 which is not NaN

// Dates
isNaN(new Date()); // false; Date objects can be converted to a number (timestamp)
isNaN(new Date().toString()); // true; the string representation of a Date object cannot be parsed as a number

// Arrays
isNaN([]); // false; the primitive representation is "", which converts to the number 0
isNaN([1]); // false; the primitive representation is "1"
isNaN([1, 2]); // true; the primitive representation is "1,2", which cannot be parsed as number

더 알아보기