Symbols
Symbol은 ES6에서 추가된 데이터 타입으로 uniqueness와 privacy라는 특성을 가지고있다. Symbol은 description을 인자로 받는데 이 인자가 같더라도 같은 Symbol이 될 수 없다.
const first = Symbol("number");
const second = Symbol("number");
console.log(first === second);
false
따라서 여러 사람이 큰 규모의 오브젝트에 key를 추가하는 경우 key의 이름이 중복되어 손실되는 사고를 방지할 수 있다.
const obj = {
result: {
data: [1, 2, 3],
},
};
obj["result"] = "result";
console.log(obj);
{result: ‘result’}
const obj = {
[Symbol("result")]: {
data: [1, 2, 3],
},
};
obj[Symbol("result")] = "result";
console.log(obj);
{Symbol(result): {…}, Symbol(result): ‘result’}
Symbol(result): {data: Array(3)}
Symbol(result): “result”
[[Prototype]]: Object
이와 같이 key가 중복되는 경우에도 다른 key로 인식하게 된다.
또한 key로 불러올 때 반환되지 않아 privacy 측면에서 유리하다.
const obj = {
[Symbol("result")]: {
data: [1, 2, 3],
},
hello: "hello",
};
console.log(Object.keys(obj));
[‘hello’]
하지만 완전히 private하지는 않다. getOwnPropertySymbols 메서드를 통해 값을 받을 수 있다.
const obj = {
[Symbol("result")]: {
data: [1, 2, 3],
},
hello: "hello",
};
console.log(Object.getOwnPropertySymbols(obj));
console.log(obj[Object.getOwnPropertySymbols(obj)[0]]);
[Symbol(result)]
{data: Array(3)}
다음과 같이 값도 다 불러올 수 있으므로 딱히 유용하지는 않은 것 같다.