+'abc'
는 문자열인 'abc'
가 +
를 만난 결과로 NaN
을 반환한다. 그렇다면 typeof NaN
은 무엇일까.
console.log(+'abc'); // NaN
console.log(typeof (+'abc')); // "number"
결과는 number
이다. NaN
은 Not 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()
메서드를 사용하는 것이다.
console.log(NaN === +'abc'); // false
console.log(+0 === -0); // true
Object.is(NaN, +'abc'); // true
Object.is(-0, +0); // false
isNaN
함수의 경우, 인수를 number형으로 먼저 변환한 후 비교를 진행합니다.undefined를 넣을 경우 형변환에 의해 NaN이 되어, true가 반환됩니다.
Number.isNaN
함수는 자동 형변환을 하지 않고 비교하여,Number.isNaN(undefined)
는 false 가 됩니다.MDN 에 자세히 작성되어 있습니다~