if( x >= 0 && x <=9){
...
}
if(!isNaN(x)){
...
}
isNaN은 내부적으로 인자를 먼저 Number()로 타입캐스팅된다. 그래서 본래 인자가 NaN임에도 불구하고 NaN로 판정되지 않는 경우가 있다. 아래는 그 예시다.
(참조: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/isNaN)
isNaN(true); // 거짓
isNaN(null); // 거짓
isNaN(37); // 거짓
// 문자열
isNaN("37"); // 거짓: "37"은 NaN이 아닌 숫자 37로 변환됩니다
isNaN("37.37"); // 거짓: "37.37"은 NaN이 아닌 숫자 37.37로 변환됩니다
isNaN("123ABC"); // 참: parseInt("123ABC")는 123이지만 Number("123ABC")는 NaN입니다
isNaN(""); // 거짓: 빈 문자열은 NaN이 아닌 0으로 변환됩니다
isNaN(" "); // 거짓: 공백이 있는 문자열은 NaN이 아닌 0으로 변환됩니다
// dates
isNaN(new Date()); // 거짓
isNaN(new Date().toString()); // 참
// 이것이 허위 양성이고 isNaN이 완전히 신뢰할 수 없는 이유이다.
isNaN("blabla") // 참: "blabla"는 숫자로 변환됩니다.
// 이것을 숫자롯 parsing 하는 것을 실패하고 NaN을 반환한다.
글로벌 함수 isNaN() 보다는 엄격한 버전이다. 숫자를 담고있는 문자열("12")과 문자 모두 false를 반환하기 때문에 문자열 내의 문자가 숫자인지 체크를 하기 위해 사용하는 것은 부적절하다.
Number.isNaN('12')
false
Number.isNaN('*')
false
Number.isNaN(12)
false
isNaN() 함수가 문자열 내의 문자가 숫자임을 체크하는 방법으로 사용하는 것은 몇 가지 위험성도 존재한다. 하지만, 몇 가지 주의 점을 고려하여 사용한다면 가독성이나 코드 양을 줄일 수 있는 방법이 될 수 있을 것 같다.