Symbol
은 고유한 값을 갖고 원시타입인 symbol
를 rerturn하는 built-in 객체이다.
이 같은 특징을 활용하면 encapsulation과 information hiding을 하는데 활용할 수 있다.
const COLOR = Object.freeze({
RED: Symbol("red"),
BLUE: Symbol("blue"),
GREEN Symbol("green"),
})
const UP = Symbol("up");
이와 같이 COLOR
의 RED
값은 symbol
이고 고유한 값을 갖기 때문에 어떠한 외부 코드에도 영향을 받지 않게 된다.
ES6이전 객체 슬롯에는 [[Class]] 내부 슬롯을 가지고 있어서 toString
을 조회하면 내부 슬롯 값을 출력했다. 하지만 ES6이후에는 well-known symbol
인 Symbol.toStringTag
를 출력하게 된다.
const obj = {
get [Symbol.toStringTag]() {
return 'hi'
}
}
console.log(Object.prototype.toString.call(obj)) // [object hi]
symbol
은 for ... in
구문이나 Object.hasOwnProperty
와 같은 메서드에 나오지 않는다. 이 같은 특성을 이용해 메타데이터를 생성하는데 사용하게 된다. (Object.getOwnPropertySymbols
로 조회 가능)