# 06.3. undefined, null, 심벌, 객체 타입

## undefined 타입

undefined타입의 값은 undefined가 유일하다. var키워드로 선언한 변수는 암묵적으로 `undefined`로 초기화된다. 즉, 변수 선언에 의해 확보된 메모리 공간을 처음 할당이 이뤄질 때까지 빈 상태(대부분 비어 있지 않고 쓰레기 값)이 들어 있다. 내버려 두지 않고 자바스크립트 엔진인 `undefined`로 초기화한다. 따라서, 변수를 선언한 이후 값을 할당하지 않은 변수를 참조하면 `undefined`가 반환된다.

이처럼 undefined는 개발자가 의도적으로 할당하기 위한 값이 아닌, 자바스크립트 엔진이 변수를 `초기화` 할 때, 사용하는 값이다. 변수를 참조하였는데 `undefined`가 반환된다면, 해당 변수는 선언한 이후 할당이 되지 않은 것이다.

자바스크립트 엔진이 변수를 초기화하는데, 사용하는 `undefined`를 개발자가 의도적으로 변수에 할당한다면 undefined의 본래의 취지와도 어긋날뿐더러 혼란을 줄 수 있으므로, 권장하지 않는다.

> **Key Point💡**
>
> * 변수에 값이 없다는 것을 명시하고 싶다면? `undefined` 대신 `null`을 할당한다.

### 참고) 선언(declaration)과 정의(definition)

* undefined를 직역하면 `정의되지 않은`이다. 일반적으로 정의란 개념은 어떤 대상을 명확하게 구정하는 것을 의미한다. 자바스크립트에서 말하는 정의란, 값을 할당하여 변수의 실체를 명확히 하는 것을 말한다. 자바스크립트의 경우 변수를 선언하면 암묵적으로 정의가 이뤄지기 때문에(예: undefined) 선언과 정의의 구분이 모호하다. 보통 ECMAScript사양에서 변수는 '선언한다'라고 표현하고, 함수는 '정의한다'라고 표현한다.

## null 타입

null 타입의 값은 null이 유일하다. 자바스크립트는 대소문자를 구별하므로, null은 Null, NULL등 과 다르다. 프로그래밍 언어에서 `null`은 변수에 값이 없다는 것을 의도적으로 명시(의도적 부재)할 떄, 사용한다. 변수에 `null`을 할당하느 ㄴ것은 변수가 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미이다. 이는 이전에 할당되어 있던 값에 대한 참조를 명시적으로 제거하는 것을 으미하며, 자바스크립트 엔진은 누구도 참조하지 않는 메모리 공간에 대해 가비지 콜렉션을 수행항 것이다.

```js
var foo = "Lee";

// 이전의 참조를 제거, foo 변수는 더 이상 'Lee'를 참조하지 않는다.
// 유용해 보이지 않는다. 변수의 스코프를 좁게 만들어 변수 자체를 재빨리 소멸시키는 편이 낫다.

foo = null;
```

> **Key Point💡**
>
> 함수가 유효한 값을 반화할 수 없는 경우 명시적으로 `null`을 반환하도록 한다.

* 예를 들어 HTML요소를 검색해 반환하는 document.querySelector 메서드는 조건에 부합하는 HTML요소를 검색할 수 없는 경우 에러 대신 null을 반환한다.

```html
<body>
  <script>
    var $myClass = document.querySelector(".myClass");
    // HTML 문서에 myClass 클래스를 갖는 요소가 없다면 null이 반환된다.
    console.log($myClass); // null
  </script>
</body>
```

## 심벌 타입

ES6에서 추가된 7번째 타입으로 **변경이 불가능한 원시 타입의 값**이다. 심벌 값은 다른 값과 중복되지 않는 유일무이한 값이다.따라서, 주로 충돌의 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해 사용한다.

심벌 이외의 원시 타입 값은 리터럴을 통해 생성하지만 심벌은 `Symbol` 함수를 호출해 생성한다. 이때 생성된 심벌 값은 외부에 노출되지 않으며, 다른 값과 절대 중복되지 않는 유일무이한 값이다.

```js
// 심벌 값 생성
var key = Symbol("key");
console.log(typeof key); // symbol

// 객체 생성
var obj = {};

// 이름이 충돌할 위험이 없는 유일무이한 값인 심벌을 프로퍼티 키로 사용한다.,
obj[key] = "value";
console.log(obj[key]); // value
```

## 객체 타입

자바스크립트의 데이터 타입은 크게 `원시 타입`과 `객체 타입`으로 구분된다. 자바스크립트는 객체 기반의 언어이며, **자바스크립트를 이루고 있는 거의 모든 것이 객체**이다.

## 요약

* undefined타입의 값은 undefined가 유일하다.
* 변수를 선언하고 할당하지 않은 상태로 참조할 경우 undefined가 반환이 된다. (var, let의 경우)
* 변수에 값이 없다는 것을 명시하고 싶다면? `undefined` 대신 `null`을 할당한다.
