난 이제 더 이상 숫자가 아니에요, NaN

김재만·2022년 5월 2일
0
post-custom-banner

Not A Number(NaN)

NaN은 전역 객체(GO)의 속성으로, 전역 스코프의 변수 중 하나이다. 초기 값은 Not-A-Number로, Number.NaN과 같다. 최신 브라우저에서는 NaN이 설정불가-쓰기불가의 속성이다.

  • 전역 객체에 이미 NaN 값이 있다.

NaN의 속성은 number를 반환하며, 아래의 연산을 거치면 해당 변수의 참조 값이 NaN을 가리키게 바뀐다. NaN은 숫자로서는 NaN, 문자열로서는 'NaN" 값을 가지고 있다.

NaN을 반환하는 연산

  • parseInt(), Number()와 같은 내장함수로 숫자로서 읽을 수 없는 값을 숫자로 반환한 경우 ex) parseInt("난!!")

    parseInt()와 Number()의 차이

    • parseInt()는 인자 값을 해석하여, 숫자로 임의로 변환한다. 그리고 소수로 표기된 숫자도 정수로 표현한다.(소수로 표기하려면 parseFloat()을 써야 한다.)
    • Number()는 인자값이 정확히 숫자로 변환할 수 없는 값이라면 바로 NaN을 반환한다. 대신 int형 float형을 가리지 않고 숫자형으로 변환해준다.
  • 결과가 허수인 수학 연산 결과 ex) Math.sqrt(-1) > 1의 제곱근 i는 허수

  • 피연산자에 NaN이 포함된 경우 ex) 3 * NaN

  • 정의할 수 없는 계산식 ex)0* Infinity

  • 문자열을 포함한 계산식 ex) "가나다"*3

    • 단, 덧셈의 경우 자바스크립트에서 문자열로 임의 변환하여 계산하므로 문자열이 반환된다.

NaN의 판별

NaN은 다른 NaN과 동일하지 않다.

Number.NaN === NaN // false

때문에, NaN의 판별을 위해선 isNaN() 혹은 Number.isNaN()을 활용하는 것이 좋다.

  • isNaN()의 경우 현재 값이 NaN이거나, 숫자형으로 변환 시 NaN인 경우 참을 반환
  • Number.isNaN()의 경우 현재 값이 NaN인 경우에만 참을 반환

배열 메소드의 일부는 NaN을 찾을 수 없다.

let arr = [2, 4, NaN, 12];
arr.indexOf(NaN); // -1

NaN의 연산

  • NaN * 0 = NaN
  • NaN ** 0 = 1
  • NaN + "String" = "NaNString"

마무리

NaN 널 모르겠다

profile
듣는 것을 좋아하는 개발자입니다
post-custom-banner

0개의 댓글