본문 바로가기
Study/JavaScript

includes로 NaN을 확인 할 수 있을까?

by dev_kong 2021. 11. 24.
728x90
728x90

https://kong-dev.tistory.com/23?category=982997 

 

문자열 다루기 기본

문제 설명 문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다. 접근방법

kong-dev.tistory.com

저 문제 정리하다가 갑자기 생긴 의문

배열에 NaN 이 있으면

includes로 찾을 수 있을까..?

 

let arr = [NaN];
console.log(arr10.includes(NaN));  // true

정답은 찾을 수 있다. 쌉가능

어떻게 찾는 걸까

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

NaN은 자기자신과도 같기를 거부하는 유별난 ㅅㄲ데...

궁금해져서 MDN에 들어가 includes의 폴리필을 확인해봤다.

 

function sameValueZero(x, y) {
  return (
    x === y ||
    (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y))
  );
}

많은 폴리필중 가장 간결한 느낌인걸로 골라서 찬찬히 뜯어 봤다.

x랑 y랑 같으면 바로 true를 리턴하고

x랑y가 다르다는 결과가 나오면

다음 문으로 넘어간다.

x도 number, y도 number

x도 NaN, y도 NaN 이면 true를 리턴한다.

isNaN돌리는건 이해를 하겠는데

number인지는 왜 확인 하는거지..?

문자열 'NaN'을 isNaN 돌리면 true가 나오나..?

console.log(isNaN('NaN'));  //  true

ㄴㅇㄱ 상상도 못한 결과.

근데 알고보니까 이게 NaN이라 그런게 아니라

모든 문자열에 isNaN을 돌리면 true가 된다.

console.log(isNaN('큰완두콩'))  // true
console.log(isNaN('aa'))        // true
console.log(isNaN('akdfljabn')) // true

아마 문자열을 isNaN을 돌리면 문자열을 number로 변환을 하나보다.

숫자로 이루어진 문자열이 아니면

NaN으로 변환이 되고 

isNaN의 출력이 true로 되는 것 같다.

그래서 위 폴리필에 x와y의 타입을 number인지 아닌지 확인 하는 것 같다.

신기한 JavaScript의 세계...

 

이번 기회를 통해 NaN... 너에 대해 조금 더 알게 된거같아..

728x90
728x90

댓글