자바스크립트(JavaScript)의 NaN !== NaN, 왜 그럴까?

by DD
4개월 전
조회수 34

자바스크립트(JavaScript)에서 NaN은 '숫자가 아님(Not a Number)'을 의미하며, 유효하지 않은 숫자 연산의 결과로 나타남

NaN은 특정 값을 나타내지 않고, 알 수 없거나 유효하지 않은 결과를 의미하며, IEEE-754 부동 소수점 표준을 따름

NaN은 자기 자신과 비교 시에도 false를 반환하며, Number.isNaN() 함수를 사용하여 NaN 여부를 안전하게 확인할 수 있음

NaN의 의미: '알 수 없는 결과'

본문에 따르면 NaN은 '숫자가 아님(Not a Number)'을 의미하며, 유효하지 않은 숫자 연산(Invalid Numeric Operation)의 결과로 생성된다.

0 / 0, Math.sqrt(-1), Number("💩") 등은 모두 NaN을 반환

NaN은 특정 값을 나타내는 것이 아니라, 알 수 없거나 정의되지 않은 결과를 의미

IEEE-754 부동 소수점 표준(IEEE-754 Floating-Point Standard)에 따라 여러 NaN 표현이 가능하며, 자바스크립트(JavaScript)는 이를 노출하지 않음

결과적으로 NaN은 비교 연산(Comparison Operation)을 무의미하게 만드는 역할을 수행한다.

NaN 비교의 특이한 동작 원리

글에서는 NaN이 자기 자신과 비교 시에도 false를 반환하는 이유를 설명하며, 이는 NaN이 특정 값을 대표하지 않기 때문이라고 강조한다.

NaN === NaN // false, NaN !== NaN // true

NaN은 '알 수 없는 결과'이므로, 두 NaN이 동일한 방식으로 실패했는지 증명할 방법이 없음

관계 연산(Relational Comparison)에서도 NaN은 false를 반환

Object.is(NaN, NaN) // true: Object.is()는 특수한 숫자 케이스를 다르게 처리

이러한 동작은 유효하지 않은 계산 결과가 마치 유효한 값처럼 동작하는 것을 방지하여 디버깅(Debugging)을 용이하게 한다.

NaN 확인 방법: Number.isNaN()

본문에서는 NaN 여부를 확인하는 올바른 방법으로 Number.isNaN() 함수를 제시하며, isNaN()의 문제점을 지적한다.

value === NaN // 항상 false: 직접 비교는 불가능

Number.isNaN(value) // 올바른 방법: 안전하고 정확한 NaN 검사

isNaN("123") // false, isNaN("💩") // true: isNaN()은 타입 변환(Type Coercion)으로 인해 예상치 못한 결과 발생 가능

Number.isNaN()은 타입 변환 없이 NaN 여부를 판단하므로, 대부분의 경우 안전하게 사용할 수 있다.

Why NaN !== NaN Makes Perfect Sense (I Promise)