자바스크립트를 개발을 하다보면 값이 없거나 올바르지 않을 경우, undefined, null, NaN를 볼 수 있다.
이것들에 의미와 용도, 내부 처리 방식에서 중요한 차이점이 있습니다.
undefined는 변수는 선언되었지만 값이 할당되지 않았을 때 자바스크립트 엔진이 자동으로 부여하는 값입니다.
let a;
console.log(a); // undefined
또한, 다음의 경우에도 undefined가 발생합니다:
function test() {}
console.log(test()); // undefined
const obj = {};
console.log(obj.name); // undefined
메모리 측면에서는 undefined는 가비지 컬렉션과 직접적인 관련이 없습니다. 단지 값이 정의되지 않았음을 표현할 뿐입니다.
null은 개발자가 명시적으로 변수에 "값이 없다"는 것을 표현하기 위해 할당하는 값입니다.
let user = null; // 현재 사용자 정보가 없음을 명확히 표현
특히 메모리 해제와 관련이 있습니다. 예를 들어 대용량 객체를 더 이상 사용하지 않을 때, 해당 참조를 null로 설정하면 가비지 컬렉션 대상이 될 수 있습니다:
let data = { /* 큰 데이터 */ };
data = null; // 더 이상 참조하지 않으므로 메모리에서 해제 가능
console.log(null == undefined) //true
console.log(null === undefined) //false
NaN은 숫자 타입이지만 수학적으로 의미 없는 계산 결과를 나타냅니다.
const result = 0 / 0;
console.log(result); // NaN
console.log(Number('abc')); // NaN
특징:
typeof NaN은 'number'NaN === NaN은 falseisNaN(value) 또는 Number.isNaN(value)로 확인해야 함console.log(NaN === NaN); // false
console.log(Number.isNaN(NaN)); // true
| 구분 | 의미 | typeof 결과 | 개발자가 직접 설정 | 가비지 컬렉션 관련 |
|---|---|---|---|---|
| undefined | 값이 할당되지 않음 | "undefined" | 아니요 | 아니요 |
| null | 값이 없음을 의도적으로 설정 | "object" | 예 | 예 |
| NaN | 숫자가 아님 | "number" | 아니요 | 아니요 |
undefined는 값이 할당되지 않은 상태로, 자바스크립트 엔진이 자동으로 부여합니다. 반면 null은 값이 없음을 개발자가 의도적으로 표현하기 위해 사용하는 값입니다.
null은 어떤 값이 의도적으로 "비어있다"는 것을 명확하게 표현할 수 있으며, 객체의 참조를 끊고 메모리 해제를 유도하는 데 사용할 수 있습니다.
NaN은 수학 연산 결과로 발생하며, JavaScript에서는 숫자형 연산의 실패를 나타내기 위해 NaN을 "number" 타입으로 정의했습니다.
NaN은 계산 불능이라는 개념을 담고 있기 때문에 어떤 NaN 값도 자신과 같다고 판단하지 않습니다. 이는 IEEE 754 부동소수점 표준인 ‘NaN은 어떤 수와도 같지 않으며, 자기 자신과도 같지 않다’를 따릅니다. 즉, NaN !== NaN은 자바스크립트 고유의 이상한 동작이 아니라, IEEE 754 표준에 따라 정상적인 동작입니다.