JavaScript에서 NaN은 무엇입니까? 그 유형은 무엇입니까? 값이 NaN과 같은지 어떻게 안정적으로 테스트할 수 있습니까?

JavaScript에서 NaN는 전역 Object의 속성입니다. 즉, Global 범위에서 사용할 수 있는 변수입니다.

Not-A-Number의 약자이지만 흥미롭게도 유형은 number 입니다.

console.log(typeOf NaN); // "number"

number 작업이 해당 개체에 적용될 때 컨텍스트에서 number 로 계산되지 않거나 계산되지 않는 개체를 나타내는 데 사용됩니다.
NaN에 대한 또 다른 흥미로운 사실은 절대 자신과 같지 않다는 것입니다. 따라서 NaN == NaN 또는 NaN === NaN는 항상 false입니다.

console.log(NaN == NaN); // false
console.log(NaN === NaN); // false



NaN 테스트



a NaN 는 다른 NaN 와 결코 같지 않기 때문에 값의 자체 비교는 값이 NaN 인지 테스트하는 가장 신뢰할 수 있는 방법입니다.

function isThisNaN(value) { return value !== value };

isThisNaN(1); // false
isThisNaN(NaN); // true
isThisNaN(Number.NaN); // true
isThisNaN('NaN'); // false


객체가 NaN인지 테스트하는 다른 방법은 isNaN() 전역 메서드와 Number.isNaN()를 사용하는 것입니다.

console.log(isNaN('hi')); //true
console.log(isNaN('4'); // false


위의 두 예에서 isNaN()는 비교하기 전에 string에 대한 유형 강제 변환을 기다립니다. 첫 번째 경우 'hi' 에서 stringnumber 로 강제 변환되고 숫자를 반환하지 않기 때문에 NaN 로 평가됩니다. '4' 가 있는 두 번째 경우에는 number 로 평가되므로 NaN 가 아닙니다. 따라서 isNaN()를 사용하는 것은 NaN를 테스트하기에 그다지 신뢰할 수 없습니다.

반대로 Number.isNaN()는 현재 값을 테스트합니다.

console.log(Number.isNaN('hi')); // false
console.log(Number.isNaN('4')); // false (this time because 
                                // it's a string in the
                                // context of a Number method)


유형 강제는 Number.isNaN() 에 없습니다. 대신 문자열을 직접 비교합니다. 위의 코드에서 'hi''4'는 모두 string이므로 NaN 메서드의 컨텍스트에서는 Number가 아닙니다. 이렇게 하면 Number.isNaN() 값을 테스트하는 동안 isNaN()NaN보다 더 안정적입니다.


참조
  • NaN
  • How can you reliably test if a value is equal to NaN?
  • 좋은 웹페이지 즐겨찾기