undefined
와 null
은 모두 원시(primitive) 자료형이다. 원시 자료형이란 객체가 아니면서 메서드도 가지지 않는 데이터를 말한다. 원시 값에는 7종류, string
, number
, bigint
, boolean
, undefined
, symbol
, null
이 존재한다.
undefined
는 원시값으로, 선언한 후 값을 할당하지 않은 변수 혹은 값이 주어지지 않은 인수에 자동으로 할당된다.
값을 할당하지 않은 변수는 undefined
자료형이다. 또한 메서드와 선언에서 평가할 변수가 값을 할당받지 않은 경우에도 undefined
를 리턴한다. 함수는 값을 명시적으로 반환하지 않으면 undefined
를 리턴한다.
그러니까 아직 정의 되지 않은 값이 바로 undefined 이다.
var x;
if (typeof x === 'undefined') {
// 이 문이 실행됨
}
typeof를 사용하는 이유 중 하나는 선언하지 않은 변수를 사용해도 오류를 던지지 않기 때문
// x를 선언한 적 없음
if (typeof x === 'undefined') { // 오류 없이 true로 평가
// 이 문이 실행됨
}
if(x === undefined) { // ReferenceError
}
null
은 JavaScript
에서 어떤 값이 의도적으로 비어있음을 표현하며 불린(Boolean) 연산에서는 거짓으로 취급한다.
null
은 undefined
와 같은 글로벌 객체의 속성에 대한 식별자가 아니다. 대신 null
은 식별되지 않은 것을 표현한다. 즉, 변수가 아무런 객체를 가리키지 않음을 표현합니다. API
에서는 null
을 종종 관련된 객체가 존재하지 않을 때 그 객체 대신 사용합니다.
동등 연산자(==)와 일치 연산자(===)의 차이에 주의하면서. 아래 예제를 살펴보자.
typeof null // "object" (하위호환 유지를 위해 "null"이 아님)
typeof undefined // "undefined"
null === undefined // false
null == undefined // true
null === null // true
null == null // true
!null // true
isNaN(1 + null) // false
isNaN(1 + undefined) // true
NaN
속성은 Not-A-Number(숫자가 아님) 를 나타낸다.
NaN
은 다른 모든 값과 비교(==, !=, ===, !==)했을 때 같지 않으며, 다른 NaN
과도 같지 않다. NaN
의 판별은 Number.isNaN() 또는 isNaN()을 사용하면 명확하게 수행할 수 있다. 오로지 NaN
만이 자기자신과 비교했을 때 같지 않음을 이용할 수도 있다.
NaN === NaN; // false
Number.NaN === NaN; // false
isNaN(NaN); // true
isNaN(Number.NaN); // true
레퍼런스 :
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/undefined
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/null
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/NaN