받은 인자값이 NaN, 숫자가 아닌지 판별하는 함수
isNaN()안에 들어가는 값이 숫자가 아니면 true, 숫자이면 false를 반환하게 된다.
isNaN(NaN); // true
isNaN(undefined); // true
isNaN({}); // true
isNaN(true); // false
isNaN(null); // false
isNaN(37); // false
// 문자열
isNaN("37"); // false
예시에서 보면 null과 "37"은 예상치못한 결과가 나온다.
isNaN()은 숫자가 아니면 true를 반환해야하는데 둘다 false,즉 number라고 나온다.
typeof로 자료형을 알아보자
typeof null // object
typeof "37" // string
typeof의 결과를 보면 null은 object, "37"은 string이 나온다.
즉, number가 아니기 때문에 true가 나와야 정상이다.
어찌된 일인가...
이것은 isNaN()의 동작방식 때문이다.
null과 "37"를 Number()을 이용해서 숫자로 명시적 형변환을 해보자
Number(null) // 0
Number("37") // 37
typeof Number(null) // number
typeof Number("37") // number
Number()로 숫자로 변화해주고 typeof로 타입을 확인해주면 둘다 number가 나온다.
즉, isNaN()은 받은 값을 먼저 number로 형변환을 해준 뒤, 숫자가 아닌지 판별하는 것이다.
isNaN()은 받은 값(인수)를 number로 변환한 뒤 판별하는 것이란걸 알았다. 그렇기 때문에 isNaN()보다는 직접 typeof로 타입을 확인하는 것이 더 정확할 것 같다.