NaN과 isNaN()

신은수·2023년 4월 7일
0

VanillaJS

목록 보기
2/11

1. NaN

  • NaN: Not a Number의 약어로 한국어로 해석하면 '숫자가 아니다'라는 뜻이지만, 실제로는 잘못된 수학 계산 또는 잘못된 숫자를 의미.

  • 다음과 같이 숫자가 아닌 값에 연산을 수행하거나, 0을 0으로 나누면 NaN 출력

  • NaN은 숫자형이지만 숫자가 아닌 값

    console.log(0 / 0); // NaN
    
    console.log(100 / 'hi'); // NaN
    
    console.log('hi' * 100); // NaN
    
    NaN을 반환하는 연산(MDN)
    • 숫자로 변환 실패 (예시: parseInt("blabla"), Number(undefined)와 같은 명시적인 것 또는 Math.abs(undefined)와 같은 암시적인 것)
    • 결과가 허수인 수학 계산식 (예시: Math.sqrt(-1))
    • 정의할 수 없는 계산식 (예시: 0 * Infinity, 1 ** Infinity, Infinity / Infinity, Infinity - Infinity)
    • 피연산자가 NaN이거나 NaN으로 강제 변환되는 메서드 또는 표현식 (예시: 7 ** NaN, 7 * "blabla") - 이것은 NaN이 전염성 있다는 것을 의미합니다.
    • 유효하지 않은 값이 숫자로 표시되는 기타 경우 (예시: 잘못된 날짜 new Date("blabla").getTime(), "".charCodeAt(1))

2. isNaN() 함수

1) isNaN( )

  • 어떤 값이 NaN인지 판별함.
    console.log(isNaN(null)) // false(NaN이 아님)
    console.log(isNaN("10")) // false(NaN이 아님)
    console.log(isNaN(undefined)) // true(NaN임) undefined는 NaN이 아니기 때문에 false가 나올 것으로 예상
    console.log(isNaN("hello world")) // true(NaN임) 문자열은 NaN이 아니기 때문에 false가 나올 것으로 예상
    console.log(isNaN(NaN)) // true

2) isNaN() 함수 동작원리

  • isNaN()함수는 넘어오는 인수를 먼저 숫자로 변환시도한다. 그리고 그 결과값을 통해 NaN 여부를 확인함.

    isNaN(Number(null)) 
    isNaN(0) // false
    
    isNaN(Number("10"))
    isNaN(10) // false
    
    isNaN(Number(undefined))
    isNaN(NaN) // true
    
    isNaN(Number("hello world"))
    isNaN(NaN) // true
    
    isNan(Number(NaN))
    isNAN(NaN) // true

3. Number.isNaN()

  • isNaN()은 인수가 Number형이 아닌 경우, 그 값을 먼저 Number형으로 형변환 후, NaN인지 판별하기 때문에 예상치 못한 결과를 내기도 함.
  • 이런 문제를 해결하기 위해 EcmaScript2015에서 Number.isNaN()을 도입.
  • Number.isNaN() 함수는 주어진 값의 유형이 Number이고 값이 NaN이어야만 true를 반환함.
      console.log(Number.isNaN(null)) // false
      console.log(Number.isNaN("10"))  // false
      console.log(Number.isNaN(undefined)) // false, isNaN()으로는 true
      console.log(Number.isNaN("hello world")) // false, isNaN()으로는 true
      console.log(Number.isNaN(NaN)) // true

NaN을 숫자가 아닌 것들로 해석해서 string이나 null, undefined는 다 isNaN으로 했을 때 true로 나와야하는 것 아닌가 해서 처음에 너무헷갈렸다.
내가 생각한 대로 나오려면, typeof 을 써야한다는 것을 알게 되었다.

profile
🙌꿈꾸는 프론트엔드 개발자 신은수입니당🙌

0개의 댓글