const a= Symbol(); // new를 쓰지 않음.
const b= Symbole();
console.log(a, b);
=> Symbole() Symbol()
a==b //false
a===b //false
const id1=Symbol('id')
const id2=Symbol('id')
console.log(id1, id2);
=> Symbole('id') Symbol('id')
id1==id2 //false
id1===id2 //false
const id=Symbol('id')
const user={
name:'jjryu',
job:'dev',
[id]:'jj_ryu'
}
console.log(user)
=> {name: 'jjryu', job: 'dev', Symbol(id): 'jj_ryu'}
java script에는 enum 타입이 없어, Symbol을 이용해서 구현함.
// enum 구현
const BLOOD_TYPE=Object.freeze({
A:Symbol('A'),
B:Symbol('B'),
O:Symbol('O'),
AB:Symbol('AB')
})
// iterator 구현
obj={
[Symbol.iterator](){
return{
next(){
return
}
}
}
}
for( type in BLOOD_TYPE){
console.log(type)
}
//예제 1 (정보은닉)
const NAME=Symbol('name')
const GENDER=Symbol('gender')
const jj={
[NAME]:'JJ',
[GENDER]:'male',
job: 'dev',
getName(){
console.log(this[NAME])
},
setName(name){
this[NAME]=name;
},
getGender(){
console.log(this[GENDER])
}
}
jj.getName()
jj.setName('jjryu')
jj.getName()
jj.getGender();
// 예제 2. 멤버변수 conflict 예방
class Counter{
count=0;
add(){
this.count+=1;
return this;
}
}
class ChildCounter extends Counter{
count=function(){...}; // Conflict 발생!!!!
// Counter가 외부라이브러리라면 의도치 않게 덮어씌어져 오류발생
}
// Counter를 아래와 같이 정의하면 상속시 변수명 중복 방지
const count=Symbol();
class Counter{
[count]=0;
add(){
this[count] +=1;
return this;
}
}
let name01=Symbol.for('name')
let name02=Symbol.for('name')
name01==name02 //true
name01===name02 //true