[Javascript] NaN / Infinity
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). 정수와 실수를 같은 타입으로 표현. 정수 안전 범위는 . 정수 안전 범…
💬 댓글