[Javascript] 자바스크립트의 함정: NaN

[원본 링크]

자바스크립트에서 NaN은 Not a Number의 줄임말로, 뭔가 실패한 숫자값을 표현할 때 사용한다.

대표적으로, 문자열에서 숫자를 파싱해올 때 NaN이 발생한다.

때문에 이런 작업을 거칠 때는 해당 반환값이 NaN인지 아닌지를 체크해야 하는데.
여기에 발목까지 잘려나갈 수 있는 함정이 존재한다.

그냥 NaN으로 비교하면 안된다.
이런 엄청난 결과값이 나올 수 있기 때문이다.

?? 분명히 NaN을 반환하길래 NaN과 동등 비교를 했는데 false가 나온다.

사실 NaN과 NaN을 동등 비교해도 false가 나온다.

이건 NaN값들이 똑같아보이지만 내부적으로는 다 다른 값을 가지기 때문이다.

자바스크립트의 심각한 결함 중 하나다.

그러면 이 문제를 어떻게 해결해야 할까?
NaN은 Boolean 변환 시 false로 변환되니 그냥 바로 조건식에 달면 되지 않을까?
역시 아니다. NaN이 발생했을 때는 정상적으로 false로 변환될 것이다.
1이나 2이 나왔을 때도 정상적으로 true가 반환될 것이다.
하지만.. 정상적인 숫자 0이 나오면 false를 뱉어버리고 만다.

사실 이건 근본적으로는 IEEE754의 문제이기도 하지만, 제대로 커버하지 않은 JS의 잘못도 없다고 할 수는 없겠다.

그래서 NaN 여부를 확인하려면 isNaN 함수를 사용해야만 한다.
이게 가장 좋은 방법이다.

그렇다.

참조
"『자바스크립트는 왜 그 모양일까?』, 더글라스 크락포드 저, 박수현 역, 인사이드(2020)"