이번 프로젝트는 통합테스트를 1~4차로 나눠 진행하는데, 아직 1차 테스트 기간이라 꽤나 여유로운 나날들을 보내고 있다. 물론 몇주 뒤의 나는 이 생각을 철회하겠지만......🤐
어제 개선사항으로 화면 소스를 수정할 일이 생겼고 isNaN 함수를 사용하게 되었다. NaN이 뭔지 알긴 아니까 쓴건데 기억이 가물가물해서 궁금해졌다.
그래서 NaN이 뭔데?
NaN은 "Not a Number"의 약자로 숫자가 아닌 값을 나타내는 오류값이다.
JavaScript에서는 숫자 파싱을 실패했을 경우나 계산 결과를 실수로 나타낼 수 없을 때 NaN이 반환된다.
NaN과 그 특징은 JavaScript에서 발명한 것은 아니며, 컴퓨터상의 부동소수점 표준인 IEEE 754에 명시되어 있다. (이 어색한 번역투는 뭐람... 영어공부를 해야겠다)
MDN 문서에 의하면 NaN이 반환되는 연산에는 아래와 같은 예시들이 있다.
// 1. 숫자 변환에 실패했을 경우
parseInt("blabla");
Number(undefined);
Math.abs(undefined);
// 2. 결과가 실수가 아닌 수학 연산
Math.sqrt(-1);
// 3. 불확정형
0 * Infinity;
// 4. 잘못된 값을 숫자로 표현해야 하는 경우
let time = new Date("blabla").getTime();
NaN 체크 방법
NaN은 자기 자신과 같지 않다는 특이한 특징이 있다. 그래서 x === NaN과 같은 방법으로 확인할 수 없다.
JavaScript에서 NaN을 확인하는 방법은 Number.isNan() 과 isNan()이 있다.
둘 다 NaN 여부를 boolean형으로 반환한다는 점에서는 같지만, 동작하는 방식에 차이가 있다.
isNaN은 값을 숫자로 형변환한 후 NaN 여부를 확인하고, Number.isNaN은 값이 현재 NaN인지를 확인하고 결과를 반환한다.
그래서 숫자가 아닌 값에 대해서는 결과가 다를 수 있다.
isNaN("hello world"); // true
Number.isNaN("hello world"); // false
isNaN(NaN); // true
Number.isNaN(NaN); // true
참고 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN