Symbol
자바스크립트에서 객체의 property가 될 수 있는 타입은 string
과 Symbol
이다.
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
은 본래 class
의 private
멤버 변수를 위해서 만들어졌는데 사실상 실패했다.
Object.getOwnPropertySymbol
을 이용하면 모든 심볼을 볼 수 있기 때문이다. 또 Reflect.ownKeys
를 통해서도 심볼형 키를 열람할 수 있다.