Why “NaN === NaN” is False? / 왜 NaN===NaN는 false 인가?

비니·2023년 4월 14일
1

JS

목록 보기
2/2
post-thumbnail

Why “NaN === NaN” is False?

  • NaN은 특별한 값을 가지고 있어서, NaN과 NaN은 동등 비교(===)를 하면 항상 false를 반환.
  • 이는 NaN이 "숫자가 아님"을 나타내는 특수한 값이지만, 실제로는 값이 정의되어 있지 않은 상태이기 때문!!!!
  • 다른 어떤 값과도 (자기 자신 포함) 같지 않기 때문임.
  • 이는 정의되지 않거나 나타낼 수 없는 수학적 작업의 결과를 나타내는 특수한 값

  • NaN은 "숫자가 아님"을 의미하지만, 실제로는 JavaScript에서 특정 값으로 반환될 수 있는 특정 값이다.
    예를 들어 0을 0으로 나누거나 잘못된 숫자를 구문 분석하려고 시도하는 경우 NaN이 반환될 수 있음.

  • NaN은 특정한 숫자 값이 아니기 때문에, === 연산자를 사용하여 자기 자신을 비롯한 어떤 값과도 비교할 수 없음

값이 NaN인지 여부를 테스트하려면 JavaScript의 내장 함수인 isNaN() 함수를 사용

- NaN ❌  => false 반환
- NaN 🅾️ => true 반환

===Number나 ===float, ===int 대신 isNaN()을 쓰는 이유?

===Number===float, ===int와 같은 비교 연산자는
특정 타입의 값을 확인하기 위해 사용.

하지만 isNaN() 함수는 값이 NaN인지 여부를 확인하기 위해 사용


숫자가 아닌 값들에 대해서도 예상되는 결과를 얻기 위해서 isNaN() 함수를 쓴다!

isNaN()함수는 숫자인지에 대한 여부를 확인하기 위해서 사용 됨.

값이 NaN인지 여부를 확인하기 위해서는 isNaN() 함수를 사용해야한다.

NaN 여부 확인을 위해 isNaN() 을 써야하는 상황은 뭐가 있을까?

  1. 사용자 입력 값의 유효성 검사

    • 사용자로부터 입력받은 값이 숫자인지 아닌지를 확인하여 유효성을 검사 할 때
  2. 계산 결과의 유효성 검사

    • 계산 결과가 숫자인지 아닌지를 확인하여 유효성을 검사할때
  3. 데이터 처리

    • 데이터를 처리하는 도중에 유효하지 않은 값을 처리할 때
      1. 문자열을 숫자로 변환할 때 생기는 오류 처리

      • parseInt(), praseFloat() 함수를 이용해서 문자열을 순자로 변환할 수 있지만 변환 결과가 NaN일 경우

          let num = parseInt("Hello World");
          if(isNaN(num)) {
          	console.log("문자열을 숫자로 반환할 수 없습니다.");
          }       


      2. 수학적 계산에서 NaN 값이 생성될 수 있는 경우

      • 0으로 나누거나, Infinity를 0으로 나누는 수학적 계산을 수행하는 경우.

        let result = 10/0;
        if(isNaN(result)) {
        	console.log("0으로 나누어 계산할 수 없습니다.");
        }          

숫자가 아니면 다 NaN인 거 아니야?

  • NaN은 숫자가 아님을 나타내는 값
    • 🤔 0으로 나누거나 0을 곱하면 NaN.
  • 하지만 모든 비숫자 값이 NaN인 것은 아님 ❌❌❌
    - 🤔 Infinity(양의 무한대)-Infinity(음의 무한대)는 숫자 🅾️🅾️🅾️ => NaN ❌❌❌
    - 🤔 null, undefined 등의 값도 NaN가 아님.

    Infinity, -Infinity 같은 숫자는 NaN로
    모든 비숫자 값이 NaN인 것은 아니다 !!

1개의 댓글

comment-user-thumbnail
2023년 4월 17일

흥미로운 글 잘 읽었습니다 ㅎㅎ NaN은 특정한 숫자 값이 아니기 때문에, 어떤 값과도 비교할 수 없으므로, 값이 NaN인지 테스트하려면 isNaN() 함수를 사용하자! null, undefined 등의 값이 NaN가 아니라는 것도 신기하네요! 놓치기 쉬운 부분인 것 같은데 알아갑니다 :)

마지막에 "🤔 0으로 나누거나 0을 곱하면 NaN" 라는 것이 궁금해서 직접 콘솔에 찍어 보니 0을 곱했을 때는 0이 나와서 isNaN === false가 나오더라구요! 혹시 0을 곱했을 때 NaN이 나오는 예제를 아실까요??

그리고 0으로 나누는 것도 "0을" 0으로 나눌때만 NaN인게 맞나요 ?! 그럼 마지막 부분에서 앞에 "0을" 이라는 말을 붙여주면 덜 헷갈릴 것 같아요 ㅎㅎ!

답글 달기