Nextra 2 Alpha
  • Javascript
  • Symbol

Symbol

자바스크립트에서 객체의 property가 될 수 있는 타입은 stringSymbol이다. object[1], object[true]로 표현기도 하는데 이런 primitive한 값은 모두 string으로 변한다.

그렇다면 Symbol은 언제 사용해아할까? 우선 Symbol의 특징을 살펴보자.

Symbol은 유일하다

const id = Symbol("id")
const id2 = Symbol("id") 
 
console.log(id === id2) // true

Symbol타입의 데이터는 항상 유일하다. Symbol을 생성할 때 사용하는 인자가 같아도 마찬가지다.

Symbol은 숨겨진다.

for in이나 Object.keys()로 key값을 순회할 수 있다. 하지만 Symbol로 property를 추가했다면 순회에서 나타나지 않는다.

let id = Symbol("id");
let user = {
  name: "John",
  age: 30,
  [id]: 123
};
 
for (let key in user) alert(key); // name과 age만 출력

언제 사용?

Symbol을 사용하는 이유는 property의 충돌을 막기위해서다.

예를 들어 서드파티 객체인 person객체에 id라는 property를 만들어야한다고 해보자. 그런데 이미 id property가 존재한다면?

const person = {
    id : 2
}
 
person.id = "kyoyoung0504" // id값을 덮어씌우게 됨

이런 문제를 방지하기 위해서 Symbol을 사용한다. 그리고 Symbol의 경우에는 key 순회에 나타나지 않기 때문에 의도치 않는 프로퍼티 수정을 방지할 수 있다.

System Symbol

자바스크립트 내부에서 사용되는 심볼을 System Symbol이라고 한다. Symbol.iterator, Symbol.toPrimitive도 시스템 심볼이다. 시스템 심볼을 이용해서 기본동작을 변경시킬 수 있다. (for of 등등)

Symbol의 한계

Symbol을 완전히 숨길 수 없다. Symbol은 본래 classprivate 멤버 변수를 위해서 만들어졌는데 사실상 실패했다. Object.getOwnPropertySymbol을 이용하면 모든 심볼을 볼 수 있기 때문이다. 또 Reflect.ownKeys를 통해서도 심볼형 키를 열람할 수 있다.