본문 바로가기

JavaScript

isNaN(), Number.isNaN()에 관한 MDN 문서

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isNaN#description

 

isNaN() - JavaScript | MDN

The isNaN() function determines whether a value is NaN when converted to a number. Because coercion inside the isNaN() function can be surprising, you may alternatively want to use Number.isNaN().

developer.mozilla.org

isNaN()

isNaN() 함수는 어떤 값이 NaN인지 판별합니다. isNaN 함수 내부의 강제성은 의외일 수 있으므로 Number.isNaN()을 대신 사용할 수 있습니다. 

 

isNaN() 함수는 전역 객체의 함수 프로퍼티입니다. 숫자 값의 경우 isNaN()은 숫자가 NaN값인지 테스트합니다. isNaN() 함수의 인수가 숫자 타입이 아닌 경우 먼저 값을 숫자로 강제로 변환한 다음 결과 값을 NaN과 비교합니다. 

 

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

 

Number.isNaN()은 값이 숫자 값 NaN인지 아닌지를 테스트하는 더 신뢰할 수 있는 방법입니다. 또는 x !== x 식을 사용할 수 있으며 두 솔류션 모두 글로벌 isNaN()을 신뢰할 수 없게 만드는 오탐의 영향을 받지 않습니다. 값이 숫자인지 테스트하려면 typeof === "number"를 사용합니다. 

 

isNaN() 함수는 "입력이 숫자 컨텍스트에서 사용될 때 기능적으로 NaN과 동등한가"라는 질문에 답합니다. isNaN(x)가 거짓을 반환하면 산술 표현식에서 x를 NaN이 아닌 유효한 숫자인 것처럼 사용할 수 있습니다. 

 

isNaN(x)가 참을 반환하면 x는 NaN으로 강제로 변환되고 대부분의 산술 표현식은 NaN을 반환합니다.(NaN은 전파되기 때문에) 예를 들어 함수에 대한 인수가 산술적으로 처리 가능한지(숫자와 같이 "사용 가능한")테스트하고 숫자와 같지 않은 값은 오류를 던지거나 기본값을 제공하는 등의 방법으로 처리할 수 있습니다. 이렇게 하면 컨텍스트에 따라 값을 암시적으로 변환하여 JavaScript가 제공하는 모든 기능을 활용할 수 있는 함수를 만들 수 있습니다. 

 

아래는 isNaN에 대한 예시입니다.

 

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

isNaN(true) // false -> 주의
isNaN(null) // false -> 주의
isNaN(38) // false

isNaN("37") // false: "37" is converted to the number 37 which is not NaN
isNaN("37.17") // 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 apces is converted to 0 which is not NaN (주의!!)

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

Number.isNaN()

Number.isNaN() static 메서드는 전달된 값이 숫자 값 NaN인지 여부를 판단하고 입력이 숫자 유형이 아닌 경우 false를 반환합니다. 이 함수는 원래의 전역 isNaN() 함수보다 강력한 버전입니다. 

 

Number.isNaN() 함수는 NaN과 같음을 확인하는 편리한 방법을 제공합니다. 자바스크립트의 다른 모든 값 비교와 달리, == 또는 === 연산자는 다른 피연산자도 NaN이더라도 한 피연산자가 NaN일 때마다 거짓으로 평가되기 때문에 NaN과의 동일성 여부를 테스트할 수 없다는 점에 유의해야합니다.

 

x !== x는 가능한 모든 자바스크립트 값 중 NaN에 대해서만 참이기 때문에, 가독성이 떨어지더라도 Number.isNaN(x)를 x !== x에 대한 테스트로 대체할 수도 있습니다.

 

글로벌 isNaN() 함수와 달리 Number.isNaN() 메서드는 매개변수를 숫자로 강제 변환하지 않습니다. 따라서 일반적으로 NaN으로 변환되지만 실제로는 NaN과 같은 값이 아닌 값을 전달해도 안전합니다. 이는 또한 숫자 타입의 값 중 NaN인 값만 참을 반환한다는 의미이기도 합니다. 

 

Number.isNaN()은 매개변수를 숫자로 변환하려고 시도하지 않으므로 숫자가 아닌 값은 항상 false를 반환합니다. 다음은 모두 거짓입니다.

 

Number.isNaN("NaN"); // false
Number.isNaN(undefined);  // false
Number.isNaN({}); // false
Number.isNaN("blabla"); // false
Number.isNaN(true); // false
Number.isNaN(null); // false
Number.isNaN("37"); // false
Number.isNaN("37.37"); // false
Number.isNaN(""); // false
Number.isNaN(" "); // false