typeof NaN === 'number'

Park, Jinyong·2020년 4월 17일
2

Small, but Valuable.

목록 보기
12/19

NaN의 타입은?

+'abc'는 문자열인 'abc'+를 만난 결과로 NaN을 반환한다. 그렇다면 typeof NaN은 무엇일까.

console.log(+'abc'); // NaN
console.log(typeof (+'abc')); // "number"

결과는 number이다. NaNNot a Number의 줄임말인데 number로 취급된다.

isNaN()의 주의점

그런데, isNaN(undefined)true가 나온다. NaN임을 확인하기 앞서 undefined인지 먼저 확인할 필요가 있다.

우리는 이를 +'abc'NaN인지 확인하기 위해 isNaN()을 사용할 수 있을 것이다. 그런데, isNaN()의 인수는 Number 타입이 아닌 경우, Number 타입으로 강제 형변환을 한다. 인수가 undefined일 경우 Number(undefined)으로 형변환하면 결국 NaN이 되어 true를 반환한다. 그래서 isNaN('abc')라고 해도 true가 반환된다. MDN에 따르면 Number.isNaN()을 사용하면 형변환이 일어나지 않으므로 정상적으로 NaN 체크를 할 수 있다.

console.log(isNaN(undefined)); // true -> undefined가 Number 타입으로 강제 형변환됨!
console.log(Number.isNaN(undefined)); // false -> 그와 달리 이는 형변환이 발생하지 않는다!

Object.is()

가장 좋은 방법은 Object.is() 메서드를 사용하는 것이다.

console.log(NaN === +'abc'); // false
console.log(+0 === -0); // true

Object.is(NaN, +'abc'); // true
Object.is(-0, +0); // false

2개의 댓글

comment-user-thumbnail
2020년 4월 17일

isNaN 함수의 경우, 인수를 number형으로 먼저 변환한 후 비교를 진행합니다.

undefined를 넣을 경우 형변환에 의해 NaN이 되어, true가 반환됩니다.

Number.isNaN 함수는 자동 형변환을 하지 않고 비교하여, Number.isNaN(undefined) 는 false 가 됩니다.

MDN 에 자세히 작성되어 있습니다~

1개의 답글