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