지금까지 객체 property의 key는 문자형
숫자형이나 불린형으로 만들어도 Object.keys()로 가져오면 문자형으로 반환됨
실제로 접근할 때도 문자형으로 접근 가능
const a = Symbol(); // new를 붙이지 않음
const a = Symbol();
const b = Symbol();
console.log(a); // Symbol()
console.log(b); // Symbol()
console.log(a===b); // false
console.log(a==b); // false
const a = Symbol('여기에 이렇게 설명을 붙여줄 수 있습니다. ');
const b = Symbol('여기에 이렇게 설명을 붙여줄 수 있습니다. ');
console.log(a===b); // 설명이 동일해도 false
console.log(a==b); // 설명이 동일해도 false
const a = Symbol('aaa');
const user = {
name : 'abc',
age : 30,
[a] : 'myA'
}
console.log(user); // {name : 'abc', age: 30, Symbool(aaa) : 'myA'}
Object.keys(user); // ["name", "age"]
Object.values(user); // ["abc", 30]
Object.entries(user); // [Array(2), Array(2)]
Object.keys() / Object.values() / Object.entries() / for(let i in user){}
이런 메소드들은 key가 Symbol형인 property는 건너뜀
심볼형을 사용하면 특정 객체에 원본을 건드리지 않고 속성을 추가할 수 있음
Symbol.for() : 전역 심볼
하나의 심볼만 보장받을 수 있음
없으면 만들고, 있으면 가져오기 때문
Symbol 함수는 매번 다른 Symbol 값을 생성하지만, Symbol.for 메소드는 하나를 생성한 뒤 키를 통해 같은 Symbol을 공유
const a = Symbol.for('aaa');
const b = Symbol.for('aaa');
console.log(a===b); // true
Symbol.keyFor(a); // "aaa"
전역 심볼이 아닌 심볼은 keyfor 사용 불가
대신 description으로 이름을 알 수 있음
const a = Symbol('aaa');
Symbol.description; // "aaa"
심볼을 완전히 숨길 수 있는 방법은 없음, 아래와 같은 방법으로 확인 가능
// 다른 개발자가 만들어놓은 객체
const user = {
name : "love",
age : 30,
};
// 추후 내가 추가한 작업
// 1번
user.showName = function(){};
// 2번
const showName = Symbol("show name");
user[showName] = function(){
console.log(this.name);
};
user[showName]();
// 사용자가 접속하면 보는 메세지(기존 작업 내용)
for(let key in user){
console.log(`Her ${key} is ${user[key]}. `);
}
/*
// 1번 경우 결과
"Her name is love. "
"Her age is 30. "
"His showName is function(){}. "
// 2번 경우 결과
"love. " // 내 작업
"Her name is love. " // 기존 작업
"Her age is 30. " // 기존 작업
*/
주로 외부 라이브러리를 만들거나 가져와 사용할 때 다른 개발자들의 코드에 영향 받지 않고 영향을 주지 않기 위해서 나만 사용할 수 있는 프로퍼티를 선언할 때 사용한다.