심볼은 유일한 식별자
const a = Symbol('id'); // new를 붙이지 않는다!
// symbol 생성시 'id'같이 설명을 문자열로 전달 가능.
// 생성에는 아무런 영향이 없다
const b = Symbol('id');
console.log(a); // Symbol(id)
console.log(b); // Symbol(id)
console.log(a === b); // false
심볼은 이전 포스팅에서 언급된 Object.keys(), Object.values(), Object.entries(), for...in문 등으로 출력되지 않는다.
const id = Symbol('id');
const user = {
name : 'Mike',
age : 30,
[id] : 'myid'
}
console.log(Object.keys(user)); // ['name', 'age']
console.log(Object.values(user)); // ['Mike', 30]
for(let a in user) { // name, age
console.log(user[a]);
}
심볼은 특정 객체에 원본 객체를 건드리지 않는 선에서 값을 추가하고 싶을때 유용하게 사용가능하다
- 유일성을 보장받고,
- 일반적인 순회 출력 옵션에서 출력이 되지 않기 때문
Symbol.for() : 전역 심볼
const a = Symbol.for('id');
const b = Symbol.for('id');
console.log(a === b); // true
console.log(Symbol.keyFor(a)); // "id"
const id = Symbol('id 입니다');
console.log(id.description); // "id 입니다"
숨겨진 Symbol key 보는 법
사용 예제
// 다른 개발자가 만들어 놓은 객체
const user = {
name : 'Mike',
age : 30,
};
// 내가 작업
// user.showName = function() {};
const showName = Symbol('show name');
user[showName] = function() {
console.log('my code. result: ', this.name);
};
user[showName](); // 추가한 함수 실행. 결과 : Mike
// 객체가 선언된 부분과 매우 거리가 멀어 내가 작업할때 인지하기 어렵다고 가정
// 내가 객체에 값을 추가 했어도 여기에 영향이 안가게 하고 싶을 때 심볼 사용
// 다른 개발자가 만들어 놓은 객체에 대한 loop문
for(let key in user) {
console.log(`His ${key} is ${user[key]}.`)
}