property key: 문자형
const obj={
1: '1임',
fasle : '거짓'
}
Object.keys(obj) // ['1','fasle']
obj['1']
obj['fasle]
객체 프로퍼티 키는 문자형으로 만드는데 Object.keys를 사용해도 문자열로 반환, 접근할 때도 문자열로 접근 가능하다
이렇게 객체 프로퍼티 키는 문자열로 접근 가능한데 하나 더 가능한 형태가 심볼 형태이다.
const a = Symbol()
const b = Symbol()
console.log(a) // Symbol()
console.log(b) // Symbol()
a ===b // false
a ==b // false
const id = Symbol('id') // 심볼 내부에 문자열로 설명을 붙여줄 수 있다
심볼은 유일한 식별 자료를 만들 때 사용되며 심볼형을 사용하면 유일성이 보장된다. 유일 성이 보장됌은 전체 코드 중 딱 하나임을 의미
심볼을 객체의 키로 사용하여 Object.key, values, entries 메서드를 사용하면 키가 심벌형인 것들은 건너 뛰게 된다. (for in도 마찬가지)
심볼은 이렇게 특정 객체에 원본 데이터는 건들지 않고 특정 속성을 추가할 때 사용된다.
const id = Symbol('id')
const user = {
name :'min',
age: 25,
[id]:'myid'
}
// user
// {name: 'min', age: 25, Symbol(id): 'myid'}
Object.keys(user)
(2) ['name', 'age']
Object.values(user)
(2) ['min', 25]
Object.entries(user)
(2) [Array(2), Array(2)]
이렇게 심볼은 이름이 같아도 모두 다른 존재이지만 가끔 전역 변수처럼 이름이 같으면
같은 객체를 가리킬 때 사용 되는 것이 Symbol.for(), 전역 심볼이다.
Symbol.for()
하나의 심볼만 보장받음
없으면 만들고 있으면 가져옴
Symbol 함수는 매번 다른 Symbol 값을 생성하지만 Symbol.for() 메소드는 하나를 생성한 뒤 키를 통해 같은 Symbol을 공유
const id1 = Symbol.for('id')
const id2 = Symbol.for('id')
id === id2 // true
Symbol.ketFor(id1) // id
const id = Symbol('id임')
id.description; // id임
Object.getOwnPropertySymbols(user)
// [Symbol(id)]
Reflect.ownKeys(user)
// (3) ['name', 'age', Symbol(id)]
// 다른 개발자가 만든 객체
const user = {
name :'min',
age: 25,
}
// 내 작업
// user.showName = function(){}
const showName = Symbol('showName')
user[showName] = function () {
console.log(this.name)
}
user[showName]()
// 사용자 접속 시 보는 메세지
for(let key in user){
console.log(`his ${key} is ${user[key]}`)
}