const a = Symbol(); // new는 붙이지 않는다
const b = Symbol(); // a === b false 똑같이 생겼어도 같지않다.
const c = Symbol('id'); // 설명을 붙여줄 수도 있다.
const id = Symbol('id')
const user = {
name : 'Suri',
age : 4,
[id]: 'myid'
}
id의 유일성이 보장된다.
Object.keys(user) // ['name', 'age']
Object.values(user) // ['Suri', 4]
Object.entries(user) // [Array(2), Array(2)]
Object mathod들은 심볼은 건너뛴다. for - in 도 건너뛴다.
=> 덮어쓰기가 방지된다.
const id1 = Symbol.for('id')
const id2 = Symbol.for('id')
id1 === id2 // true
Symbol.keyFor(id1) //id 이름 알려줌
description : 전역심볼이 아닌 심볼의 이름을 보는 매소드
const id = Symbol('id입니다')
id.description // 'id입니다.'
숨겨진 Symbol key 보는 법(심볼을 완전히 숨길 수는 없다)
const id = Symbol('id')
const user = {
name:'Suri',
age:4,
[id] : 'myid'
}
Object.getOwnPropertySymbols(user) // Symbol(id)
Reflect.ownKeys(user) // ['name', 'age', symbol(id)]
const user = {
name : 'Suri',
age: 4,
}
const showName = Symbol('showName')
user[showName] = function (){
console.log(this.name)
}
// 사용자가 보는 메시지
for(let key in user){
console.log(`Her ${key} is ${user[key]}.`)
}
// Her name is Suri.
// Her age is 4
중간에 만약
user.showName = function(){}
이 들어가면, 사용자가 보는 메시지는
Her showName is function(){}
과 같은 이상한 메시지가 들어 갈 수 있는데,
이때 showName을 심볼로 유일하게 처리를 해놓으면 이런 위험이 없어진다.
다른 사람이 만들어 놓은 것을 덮어쓸일도 없고!