LHJ

I'm a FE developer.

12-5. Global 오브젝트 / NaN, 유한대 체크 함수

30 Nov 2020 » js_beginner

12-5. Global 오브젝트 / NaN, 유한대 체크 함수

isNaN()

구분데이터(값)
파라미터
반환true, false

  • 값의 NaN 여부 반환
  • 숫자 값이 아니면 true 반환

      console.log(isNaN("ABC")); // true
      console.log(isNaN()); // true
    
    1. 값이 String 타입이므로 true 반환
    2. 파라미터를 작성하지 않으면 undefined와 같음

  • 숫자 값이면 false 반환

    • 값이 숫자로 변환되면 숫자로 인식

        console.log(isNaN(123)); // false
        console.log(isNaN("123")); // false
        console.log(isNaN(null)); // false
      
      1. String 타입이라도 값이 숫자이면 숫자로 인식
      2. null을 숫자로 변환하면 0

  • NaN === NaN 결과는 false

    • 설계 실수
    • ES6의 Object.is() 사용

        console.log(NaN === NaN); // false
        console.log(Object.is(NaN, NaN)); // true
      

      NaN과 NaN을 비교하는데 false가 나오면 이는 문제가 될 수 있습니다.
      NaN을 비교할 땐 Object.is() 함수를 사용하는 것이 안전합니다.


NaN === NaN은 false가 나옵니다.
이는 설계 실수입니다.
true가 나오도록 해야되는데 false가 나오도록 한겁니다.
이거 관련해서 개발자들 사이에서도 말이 많습니다.

그런데 ES6의 Object.is() 함수를 사용하면, NaN과 NaN을 비교할 때, true가 반환됩니다.

isFinite()

구분데이터(값)
파라미터
반환true, false

  • 값이 Infinity, NaN이면

    • false 반환
    • 아니면 즉, finite(유한)이면 true 반환

        // NaN
        console.log(isFinite(0 / 0)); // false
        // Infinity
        console.log(isFinite(1 / 0)); // false
        console.log(isFinite("ABC")); // false
      

  • 값이 숫자로 변환되면 숫자로 인식

      console.log(isFinite(123)); // true
      console.log(isFinite("123")); // true
      console.log(isFinite(false)); // true
    

    false는 0으로 변환됩니다.
    0은 유한한 수이므로 true가 반환됩니다.