NaN은 전역 객체(GO)의 속성으로, 전역 스코프의 변수 중 하나이다. 초기 값은 Not-A-Number로, Number.NaN과 같다. 최신 브라우저에서는 NaN이 설정불가-쓰기불가의 속성이다.
NaN의 속성은 number를 반환하며, 아래의 연산을 거치면 해당 변수의 참조 값이 NaN을 가리키게 바뀐다. NaN은 숫자로서는 NaN, 문자열로서는 'NaN" 값을 가지고 있다.
parseInt(), Number()와 같은 내장함수로 숫자로서 읽을 수 없는 값을 숫자로 반환한 경우 ex) parseInt("난!!")
parseInt()와 Number()의 차이
- parseInt()는 인자 값을 해석하여, 숫자로 임의로 변환한다. 그리고 소수로 표기된 숫자도 정수로 표현한다.(소수로 표기하려면 parseFloat()을 써야 한다.)
- Number()는 인자값이 정확히 숫자로 변환할 수 없는 값이라면 바로 NaN을 반환한다. 대신 int형 float형을 가리지 않고 숫자형으로 변환해준다.
결과가 허수인 수학 연산 결과 ex) Math.sqrt(-1) > 1의 제곱근 i는 허수
피연산자에 NaN이 포함된 경우 ex) 3 * NaN
정의할 수 없는 계산식 ex)0* Infinity
문자열을 포함한 계산식 ex) "가나다"*3
NaN은 다른 NaN과 동일하지 않다.
Number.NaN === NaN // false
때문에, NaN의 판별을 위해선 isNaN() 혹은 Number.isNaN()을 활용하는 것이 좋다.
배열 메소드의 일부는 NaN을 찾을 수 없다.
let arr = [2, 4, NaN, 12];
arr.indexOf(NaN); // -1
NaN 널 모르겠다