자바스크립트는 데이터타입(자료형)에 대해 상당히 관대한 언어이다. 


다른 언어가 변수를 선언 할 때 자료형까지 결정 하는 반면, 

자바스크립트는 선언시 변수의 스코프(범위)와 존재만 설정하고, 

할당 할 때 비로소 자료형이 결정된다.

(다른 언어를 했었는지 어떤 개발자가 변수를 선언하고 초기화를 하지 않으면

쓰레기 값이 된다고 하는 것을 보았는데, 자바스크립트에 대해 잘 모르고서 하는 소리인것 같다.)


그래서인지, 자바스크립트를 배우는 대부분의 사람들은, 그리고 가르치는 사람들은

자료형에 대한 고민을 거의 하지 않는 편이다. 


고려하지 않아도

프로그래밍을 하는데 큰 문제가 없다(?)고 생각하는 것이다.


하지만 조금만 깊이있게 들어가면 자바스크립트도, 자료형에 대한 고민을 하지 않고서는

문제가 발생하는 경우가 많다.


그 예가 바로 undefinednull이다.


많은 사람들이 이 두가지를 구분하지 못해서 어려움을 겪는 경우가 있는데, 

이 둘은 다음과 같은 차이가 있다.



undefined -> 변수를 선언만 하고 값을 할당하지 않음.

즉, 자료형이 결정되지 않은 상태이다.

(선언하지 않은 변수도 콘솔이나 기타 메세지에는 undefined라고 뜨지만,

undefined라는 값을 가지는 것은 아니다.) 

null -> 변수를 선언하고, 'null'이라는 빈 값을 할당한 경우이다.

(이 '빈 값'의 경우 자료형에 따라 여러가지가 있지만,

null은 객체형 데이터-ex: array, object-의 빈 값을 의미한다.

문자열(string)의 경우 '', 숫자(number)의 경우 0이 빈값이고,

이들 빈값 모두는 if문에서 false로 형 변환된다.)


다시말해서, undefined는 자료형이 결정되지 않은 변수이고,


null은 자료형은 객체인데, 비어있는 변수이다.


++추가


-------------

이 글을 본 지인이 왜 그러면 console.log(undefined==null)이 true냐고 반박을 해서


글을 추가합니다. 


비교연산자 ==는 자료형이 다르면 자동 형변환으로 자료형을 강제로 맞춰서 비교하는 비교연산자입니다.


undefined와 null(object)은 자료형이 다르니 자바스크립트 엔진에서 알아서 통일해서 둘다 값이 없는거니까


true를 반환합니다. 이 경우 === 연산자(자료형까지 비교)를 사용하면 원하는 결과를 얻을 수 있습니다.