해당 포스팅은 위키북스의 모던 자바스크립트 Deep Dive라는 책을 독학하며 기록하는 글입니다.

Symbol은 ES6에서 도입된 7번째 데이터타입으로 변경 불가능한 원시 타입의 값이다. 다른 값과 중복되지 않는 유밀무이한 값으로 주로 이름의 충돌 위험이 없는 유일한 프로퍼티 키를 만들기 위해 사용한다.

Symbol의 생성

Symbol은 Symbol함수를 호출하여 생성한다. 다른 원시값과 다르게 리터럴 표기법을 통해 생성할 수 없다. 또한 다른 생성자 함수들과 달리new연산자를 사용하지 않는다.

const mySymbol = Symbol();

Symbol값을 생성하면서 문자열을 인수로 전달할 수 있지만 이는 해당 Symbol이 어떤 Symbol인지를 설명하는 description에 해당하며 값 생성에 아무런 영향을 주지 않는다.

const mySymbol = Symbol('my first symbol');

console.log(mySymbol.description); // my first symbol

추가적으로 Symbol값은 암묵적으로 문자열이나 숫자로 변환되지 않는다.

메서드

Symbol은 간단하게 두 가지 메서드를 제공한다.

  1. Symbol.for(문자열)
    인수로 들어온 문자열을 키로 값는 Symbol값을 전역 심볼 레지스트리에서 검색해 반환한다. 만약 못 찾을 시, 해당 문자열을 키로 갖는 Symbol값을 생성해서 전역 심볼 레지스트리에 등록한 뒤 반환한다.

  2. Symbol.keyFor(식별자)
    인수로 들어온 식별자가 전역 심볼 레지스트리에 저장된 키값을 반환한다.

const mySymbol = Symbol.for('first');
console.log(Symbol.keyFor(mySymbol)); // 'first'

활용

Symbol은 객체의 프로퍼티 키로 활용할 수 있다. 이는 다른 프로퍼티 키와 절대 충돌하지 않는다는 장점이 있다.

const ob = {
  [Symbol.for('first')]: 1,
}

ob[Symbol.for('first')]; // 1

이때 항상 대괄호 []를 사용해서 생성해야 하며 참조할 때도 대괄호를 사용해야 한다.

Symbol값을 프로퍼티 키로 사용해 생성한 프로퍼티의 경우 for...in이나 Object.keys 등의 메서드로 찾을 수 없다. 오직 ES6에서 도입된 Object.getOwnPropertySymbol(객체)메서드를 통해서만 찾을 수 있으며 해당 객체는 인수로 전달된 객체에 포함된 Symbol로 만들어진 프로퍼티 키들을 배열로 반환한다.

profile
I Will be Relaxed Person

0개의 댓글