오늘은 유일한 식별자를 만들 때 사용하는 심볼(Symbol)에 대한 공부를 해봤다.
정리를 해보자면....
일반적으로 우리가 Object property key를 만들 때는 문자형으로 만들었다
const obj = {
1: "1 입니다",
false: "거짓"
}
Object.keys(obj); // ["1", "false"]
obj['1'] // "1 입니다"
obj['false'] // "거짓"
앞서 공부했던 Object Method를 사용해서 가져와보면 문자형으로 보이는 것을 알 수 있다.
문자형으로도 가능하지만 또 하나 가능한 것이 있으니 바로 심볼(Symbol)형 이다.
symbol의 기본 틀은 이러하다..!
const a = Symbol();
Symbol의 특징 첫 번째!
유일한 식별자를 만들 때 사용하게 되며, new를 붙이지 않는다.
'유일한 식별자' 라는 설명답게, 똑같은 것을 할당해도 다르게 나온다.
const a = Symbol();
const b = Symbol();
console.log(a) // Symbol()
console.log(b) // Symbol()
a === b // false
a == b // false
이렇게 console.log를 찍어보면 생긴 것은 같지만 일치연산자, 동등연산자 모두 false로 나온다.
Symbol의 특징 두 번째!
유일성이 보장이 된다.
const id = Symbol('id');
const id2 = Symbol('id');
이런 경우 id, id2를 찍어보면 같은 결과가 나오지만 동등연산자, 일치연산자 모두 false가 나오게 된다.
Symbol을 객체 key로 사용하기
const id = Symbol('id');
const user = {
name: "Mike";
age: 30,
[id]: "myid"
}
user // {name: "Mike", age: 30, Symbol(id): "myid"}
user[id] // "myid"
※ [id] 이러한 computed method를 처음본다면 앞선 블로그를 먼저 보고 오시면 좋습니다!
이렇게 user를 호출하면 Symbol(id): "myid"가 잘 나오지만, 이를 Object로 불러보면 나오지 않는다.
Object.keys,values,entries 이러한 메소드들은 key가 Symbol인 것들은 건너뛰기 때문이다.
for in을 사용해도 건너뛰기 때문에 나오지 않는다.
그렇다면 언제 사용할 수 있을까?
이는 다른 사람이 만들어 놓은 객체를 내가 손을 볼 때, 내가 만든 것으로 자칫 덮어쓰거나 하면 안 되므로 안전하게 사용해야 할 때 사용된다.
Symbol을 사용하면 원본 data는 건들이지 않고, 속성을 추가하는데 사용 할 수 있기 때문이다.
Symbol.for() 라는 것이 있는데 이는 "전역심볼"이다
이는 같은 이름으로 같은 객체를 가리켜야 할 때 사용 된다.
예를 들어...
const id1 = Symbol.for('id');
const id2 = Symbol.for('id');
id1 === id2; // true
이때는 일치연산자를 쓰면 true가 나온다.
같은 id를 공유하고 있기 때문이다.
Symbol의 id를 얻고 싶다면
전역 심볼의 경우
Symbol.keyFor(id1) // id
이렇게 사용할 수 있으며
전역심볼이 아닌 경우에는
const id = Symbol('id 입니다');
id.description; // 'id 입니다'
description으로 이름을 알 수 있다