JavaScript에서 전역 속성 NaN(Not-A-Number)은 '숫자가 아님'을 나타내는 특수한 값입니다. 이 값은 주로 다음과 같은 상황에서 반환됩니다.
- Math 함수가 유효한 계산을 수행하지 못했을 때 (예:
Math.sqrt(-500)) - 문자열을 숫자로 변환하는 파싱 함수가 실패했을 때 (예:
parseFloat("test"))
특히 주의해야 할 점은 NaN은 ==, !=, ===, !== 등 어떤 비교 연산자를 사용해도 다른 모든 값과 같지 않다고 평가된다는 것입니다. 놀랍게도 NaN끼리 비교해도 마찬가지입니다.
따라서 값이 NaN인지 정확하게 확인하려면 일반적인 동등 비교 대신 Number.isNaN() 메서드를 사용해야 합니다.
예제
let a = Math.sqrt(-500); console.log(Number.isNaN(a))
출력 결과
true
isNaN()과 Number.isNaN()의 차이점
두 메서드는 이름이 비슷하지만 동작 방식에 중요한 차이가 있습니다.
- isNaN(): 값이 현재 NaN이거나, 숫자로 강제 변환(coercion)된 후 NaN이 되는 경우에도 true를 반환합니다.
- Number.isNaN(): 값이 현재 정확히 NaN일 때만 true를 반환하며, 타입 변환을 수행하지 않습니다.
예제
isNaN('hello world');
Number.isNaN('hello world');출력 결과
true false
'hello world'는 문자열이므로 원래 NaN이 아닙니다. 하지만 전역 isNaN()은 문자열을 먼저 숫자로 변환하기 때문에 변환 결과가 NaN이 되어 true를 반환합니다. 반면 Number.isNaN()은 타입 변환 없이 값 자체가 NaN인지만 검사하므로 false를 반환합니다. 따라서 의도치 않은 타입 변환을 피하고 정확한 NaN 검사를 원한다면 Number.isNaN()을 사용하는 것이 권장됩니다.