menu

isNaN( )과 Number.isNaN( )의 차이점

profile image
3 min ·June 11, 2023

가장 큰 차이는 Parameter 타입 변환

전역 공간에서 쓰는 isNaN과 Number.isNaN의 가장 큰 차이점은 파라미터의 숫자형 변환 유무다. 전역에서 쓰이는 isNaN()은 전달받은 파라미터를 숫자형으로 변환한 후 NaN 여부를 살피고, Number.isNaN()은 별도 변환없이 파라미터 그대로 NaN 여부를 판단한다. 따라서 아래와 같은 결과가 나오게 된다.

isNaN("abc"); // true;

Number.isNaN("abc"); // false

전역 isNaN(param) 은 결과적으로 isNaN(Number(param)) 과 동일하므로 숫자형으로 변환된 파라미터의 NaN 여부를 판단할 때 쓰고, Number.isNaN() 은 파라미터가 정확히 NaN인지 아닌지 알고 싶을 때 쓴다.

주의해야 할 점은, 숫자형 변환이 때때로 의외의 결과를 낳는다는 것이다. 숫자가 아닌 일부 값들은 변환을 거치면서 숫자가 될 수 있다. 예를 들어 [] , '' , null 과 같은 값들은 0이 되고, boolean형 값들은 0 혹은 1로 바뀌기 때문에 isNaN()의 결과는 false가 된다. 따라서 isNaN() 을 쓸 때는 모든 경우의 수를 곰곰이 따져볼 필요가 있다.

아래에 몇가지 예시를 추가적으로 더 정리하면서 글을 마친다. 숫자형으로 변환할 때 null0이 되고 undefinedNaN이 된다는 점이 꽤 흥미롭다.

paramisNaN()Number.isNaN
NaNtruetrue
123falsefalse
'abc'truefalse
truefalsefalse
nullfalsefalse
undefinedtruefalse
[]truefalse
{}truefalse