자바스크립트에는 Not a Number를 체크할 수 있는 방법이 있는데,
Number.isNaN(1)
Number.isNaN('1')
바로 Number.isNaN이다.
인수로 숫자가 아닌값이 들어오면 false를 리턴한다.
여기서 숫자는 integer 값이다.
다음과 같이 실수가 들어와도 false를 리턴한다.
Number.isNaN(10.1)
다음과 같은 재미있는 특성도 있다. (자기자신이 다르다는데 맞다고 하는게 NaN이다.)
var a = NaN;
a !== a;
var b = "foo";
b !== b;
var c = undefined;
c !== c;
var d = {};
d !== d;
var e = { valueOf: "foo" };
e !== e;
배열 속에 NaN이 있음을 체크하는 것도 주의해야한다.
let arr = ["1", "2", "3", "4", NaN, "5"];
print(arr.indexOf(NaN));
print(arr.includes(NaN));
print(arr.findIndex((n) => Number.isNaN(n)));
분명히 NaN에 대한 인덱스를 찾고 싶어서 indexOf를 사용했는데, 찾을 수 없다고 나온다.
그래서 arr이 NaN을 포함하고 있냐고 물었더니 true랜다.
있는데 없다?
이러한 현상이 생기는 이유는 indexOf와 includes는 equality 알고리즘을 서로 다른 것을 사용하기 때문이다.
indexOf 는 strict equality를 사용하고,
includes는 same value zero 알고리즘을사용함
그래서 includes와 같은 알고리즘을 사용하는 findIndex를 사용해서 NaN인덱스를 찾아야한다.