[TIL] NaN === NaN // false

hanbyul.choi·2023년 5월 25일
0

[TIL]

목록 보기
12/39

문제

문자열 my_string이 매개변수로 주어질 때, my_string 안에 있는 숫자만 골라 오름차순 정렬한 리스트를 return 하도록 solution 함수를 작성해보세요.

작성코드

function solution(my_string) {
    var answer = my_string.split("").map(n => Number(n)).filter((n) => {
        console.log(Number(n));
             return n !== 'NaN' ;
         })
       console.log(answer);
}

여기서 문제는 filter가 정상동작 하지 않는다.

사진처럼 return n !== 'NaN' 에서 전부 true값이 반환 되는 것 같다.

typeOf로 Number랑 비교할까 하다가 NaN도 Number라고 했던게 기억이나서 시도하지 않았고,
다옴표도 빼보았지만 결과는 똑같았다....

그래서 !== 말고 어떻게 하면 === 쓸 수 있을까 고민하다가 아래처럼 수정했다.

function solution(my_string) {
   return answer = my_string.split("")
    .map(n => Number(n))
    .filter((n) => {
             return n/1 === n ;
         })
}

만약 숫자라면 n/1을 한 뒤에 true가 나올 것이고 문자열이면 NaN이 되어 false가 될 것이라 생각했다.

결과는 정상적으로 filter가 동작했다.

마지막으로 조건에 맞게 sort 해준 뒤 그 자체를 반환해 문제를 해결했다.

function solution(my_string) {
   return my_string.split("")
    .map(n => Number(n))
    .filter((n) => {
             return n/1 === n ;
         })
    .sort()
}

새로운 변수에 할당해서 리턴하는 것이 올바른 방법같지만 나도 뭔가 짧게 써보고 싶어서 없애버렸다...ㅋㅋ


여기서 알고 싶은 것은 난 분명히 NaN이 배열에 리턴된 걸 보았지만 왜 return n !== 'NaN'에서 걸리지 않은 것일까.

function solution(my_string) {
    var answer = my_string.split("").map(n => Number(n)).filter((n) => {
        console.log(Number(n));
             return n !== 'NaN' ;
         })
       console.log(answer);
}

개발자 도구에서 NaN을 직접 비교해보았다.

!!!!!!!!!!!!!!!!!?????????????????

NaNNaN 은 같지 않다...... 갑자기 어디서 본 듯한 느낌이 든다.
JS에서는 위와 같은 조건때문에 아까 내 코드가 실행되지 않았다........

NaN은 숫자형에 속하지만 ‘정상적인’ 숫자는 아니기 때문에, 정상적인 숫자와 구분하기 위한 특별한 함수가 존재합니다.

isNaN(value) – 인수를 숫자로 변환한 다음 NaN인지 테스트함.
즉 비교연산자가 아닌 isNaN(value)이라는 함수를 사용해야함...
이걸 사용하면 내가 원하는 코드를 작성할 수 있다.

function solution(my_string) {
   return my_string.split("")
    .map(n => Number(n))
    .filter((n) => {
             return !isNaN(n) ;
         })
    .sort()
}

0개의 댓글