본문으로 건너뛰기
김신건의 로그

[Javascript] NaN / Infinity

· 수정 · 📖 약 1분 · 207자/단어 #javascript #number #nan #infinity #ieee754
JS NaN, JS Infinity, JS NaN / Infinity, JavaScript NaN, Not a Number

정의

  • NaN (Not a Number) : 의미 없는 수치 연산의 결과
  • Infinity, -Infinity : 너무 큰/작은 수, 0 으로 나누기

IEEE 754 표준에 따른 특수 값. Number 타입이지만 특이한 동작.

typeof NaN          // 'number'
typeof Infinity     // 'number'

NaN 의 발생

0 / 0                    // NaN
Infinity - Infinity      // NaN
Math.sqrt(-1)            // NaN
Number('hello')          // NaN
parseInt('xyz')          // NaN
undefined + 1            // NaN
0 * Infinity             // NaN

수치로 해석 불가능한 모든 연산.

NaN 의 비교 함정

NaN === NaN         // false ⚠️
NaN == NaN          // false
NaN === Number.NaN  // false

[NaN].indexOf(NaN)   // -1 (찾지 못함)
[NaN].includes(NaN)  // true (특별 처리)

NaN자기 자신과도 다르다. IEEE 754 의 정의.

NaN 검사

Number.isNaN(NaN)        // true ✓ (권장)
Number.isNaN('NaN')      // false (문자열은 NaN 아님)
Number.isNaN(undefined)  // false

isNaN(NaN)               // true
isNaN('hello')           // true (전역 isNaN 은 강제 변환)
isNaN('5')               // false

Number.isNaN() 권장 (엄격, 변환 없음).

Object.is

Object.is(NaN, NaN)     // true (특별 처리)
Object.is(0, -0)        // false (구분)

Infinity

1 / 0                    // Infinity
-1 / 0                   // -Infinity
Infinity + 1             // Infinity
Infinity - Infinity      // NaN
1e308 * 10               // Infinity (overflow)
-1e308 * 10              // -Infinity

Number.MAX_VALUE         // 1.7976931348623157e+308
Number.MAX_VALUE * 2     // Infinity
Number.MIN_VALUE         // 5e-324
Number.MIN_VALUE / 2     // 0 (underflow)

Infinity 검사

Number.isFinite(Infinity)  // false
Number.isFinite(NaN)       // false
Number.isFinite(42)        // true
isFinite('42')             // true (강제 변환)
Number.isFinite('42')      // false (엄격)

산술 함정

NaN + 1                  // NaN
NaN * 0                  // NaN
NaN === undefined        // false
NaN == undefined         // false

Infinity + 1             // Infinity
Infinity * 0             // NaN (수학적 정의 안 됨)
Infinity / Infinity      // NaN

NaN 이 한 번 연산에 들어가면 계속 전파 (propagates).

사용 예

사용자 입력 검증

function parseAmount(input) {
    const n = Number(input);
    if (Number.isNaN(n) || !Number.isFinite(n)) {
        throw new Error('Invalid amount');
    }
    return n;
}

누락 데이터 표현

// 통계 계산에서 누락
const data = [1, 2, NaN, 4];
const sum = data.reduce((a, b) => a + b, 0);    // NaN (전파)
const sum2 = data.filter(x => !Number.isNaN(x))
                  .reduce((a, b) => a + b, 0);  // 7 (NaN 제외)

0 의 양수/음수

0 === -0          // true
Object.is(0, -0)  // false (구분)

1 / 0             // Infinity
1 / -0            // -Infinity
0 === -0          // true (수학적으로 같음)

함정

1. == NaN 으로는 검사 불가

x == NaN     // 항상 false
x === NaN    // 항상 false
Number.isNaN(x)   // ✓

2. JSON 의 처리

JSON.stringify(NaN)             // 'null'
JSON.stringify(Infinity)        // 'null'
JSON.stringify(-Infinity)       // 'null'
JSON.stringify({ a: NaN })      // '{"a":null}'

JSON 표준은 NaN/Infinity 미지원 → null 로 변환.

3. typeof

typeof NaN        // 'number' (놀라움)
typeof Infinity   // 'number'

이름과 달리 둘 다 number 타입.

참고

이 글의 용어 (3개)
[Javascript] 타입 변환 / 강제 변환javascript
정의 JavaScript 의 암묵적 형변환 (coercion). 연산자가 양쪽 피연산자의 타입을 자동으로 맞춘다. 명시적 변환과 구분. 3 가지 강제 변환 1. ToString …
[Javascript] boolean / null / undefinedjavascript
정의 JavaScript 의 3 가지 primitive. - : , - : 의도적인 "없음" - : 자동으로 부여된 "없음" (초기화 안 됨) boolean falsy / tru…
[Javascript] Numberjavascript
정의 JavaScript 의 는 IEEE 754 double-precision float (64-bit). 정수와 실수를 같은 타입으로 표현. 정수 안전 범위는 . 정수 안전 범…

이 개념을 다룬 위키 페이지 (1)

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기