unll, undefined, undeclared는 전부 변수에 값이 없다는 점을 나타낸다. 하지만 셋의 의미는 각각 다르다.
null은 의도적으로 변수에 null을 할당하여 값이 없다는 것을 나타낸다. Null이 할당된 변수의 타입을 확인해 보면 object인 것을 알 수 있다. 한마디로 타입은 객체이고 비어있는 변수이다.
let a = null;
console.log(a); // null
console.log(typeof a); //object
변수를 선언하고 값을 할당하기 전의 값이며 변수에 할당되어 있지 않은 상태이다. 타입이 결정되지 않은 변수이다.
let b;
console.log(b); //undefined
console.log(typeof b); //undefined
위의 결과를 보면 타입이 정의되지 않았음을 알 수 있다.
접근 가능한 스코프에 변수 선언조차 되어있지 않은 상태이다. 타입을 확인해 보면 undefined이다.
console.log(b); //ReferenceError: b is not defined
console.log(typeof b); //undefined
미선언 변수 b의 typeof 결과로는 undefined를 뱉는다.
실제로 typeof는 undeclared인 경우에도 undefined를 뱉어 오류 처리를 내뱉지 않는다.
NaN는 Not a Number의 약어이다.
표현을 못하는 수치형 결과를 나타내며, 이 속성은 값이 유효한 숫자가 아니라는 것을 말한다. 즉, 컴퓨터로는 표현할 수 없는 숫자값이다.
let a = NaN;
console.log(a); //NaN
Console.log(typeof a); // number
console.log(undefined == null); //true
console.log(undefined === null); //false
왜 비교연산자(==)는 자료형이 다르면 자료형을 강제로 맞춰서 비교하는 연산자이다.
Undefined와 null은 자료형이 다르니 강제로 맞춰서 값을 비교하면 둘다 값이 없으니 true가 된다.
하지만 ===연산자를 이용하면 자료형까지 비교하므로 false가 된다. null은 의도적으로 빈 값이 들어간 object이기 때문이다.