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을 할당하느 ㄴ것은 변수가 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미이다. 이는 이전에 할당되어 있던 값에 대한 참조를 명시적으로 제거하는 것을 으미하며, 자바스크립트 엔진은 누구도 참조하지 않는 메모리 공간에 대해 가비지 콜렉션을 수행항 것이다.

var foo = "Lee";

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

foo = null;

Key Point💡

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

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

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

심벌 타입

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

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

// 심벌 값 생성
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을 할당한다.

Last updated