symbol은 유일한 식별자를 만들고 싶을 때 사용합니다.
symbol은 new를 붙이지 않고 사용합니다.
let id = Symbol();
심볼을 만들 때 심볼 이름이라 불리는 설명을 붙일 수도 있습니다.
설명은 어떤 것에도 영향을 주지 않는 이름표 역할만을 합니다.
let id = Symbol("id");
유일성이 보장되는 자료형이기 때문에, 설명이 동일한 심볼을 여러 개 만들어도 각 심볼값은 다릅니다.
let a = Symbol('id');
let b = Symbol('id');
console.log(a) // Symbol(id)
console.log(b) // Symbol(id)
alert(a == b); // false
alert(a === b); // false
Hidden Property는 외부 코드에서 접근이 불가능하고 값도 덮어쓸 수 없는 프로퍼티입니다.
객체의 키를 심볼로 사용할 수 있습니다.
let user = {
name: "zima"
};
let id = Symbol("id");
user[id] = 1;
alert( user[id] ); // 1
심볼은 유일성이 보장되므로 이름이 같더라도 우리가 만든 식별자와 제3의 스크립트에서 만든 식별자가 충돌하지 않습니다.
객체의 키 네임 id가 중복되어 기존 값이 덮어 쓰여졌습니다.
let user = { name: "zima" };
user.id = "스크립트 id 값";
user.id = "제3 스크립트 id 값"
user; // {name: 'John', id: '제3 스크립트 id 값'}
객체의 키 네임 id가 중복되었지나 기존 값이 사라지지 않았습니다.
let user = {
name: "John"
};
let id = Symbol("id");
user[id] = "스크립트 id 값";
user.id = "제3 스크립트 id 값";
user; // {name: 'John', id: '제3 스크립트 id 값', [Symbol(id)]: '스크립트 id 값'}
객체 리터럴 {...}을 사용해 객체를 만든 경우, 대괄호[]를 사용해 심볼형 키를 만들어야 합니다.
const id = Symbol('id'); // 객체 리터럴로 symbol 생성
const user = {
name: 'Zima',
age: 100,
[id] : 'myid' // 대괄호 사용
}
user // {name: 'Zima', age: 100, Symbol(id) : 'myid'}
user[id] // "myid"
Object.keys(user); // ["name", "age"]
이름이 같은 심볼이 같은 개체를 가리키길 원하는 경우 Symbol.for을 사용할 수 있습니다;
Symbol은 매번 다른 Symbol 값을 생성하지만, Symbol.for 메서드는 하나를 생성한 뒤 키를 통해 같은 Symbol을 공유합니다.
전역 심볼 레지스트리(global symbol registry) 안에 해당 이름의 심볼이 없다면 만들고, 있다면 가져오기 때문에 하나의 심볼만 보장받을 수 있습니다.
// 전역 레지스트리에 심볼이 존재하지 않으면 새로운 심볼을 만듭니다.
let id = Symbol.for("id");
// 동일한 이름을 이용해 심볼을 다시 읽습니다
let idAgain = Symbol.for("id");
// 두 심볼은 같습니다.
alert( id === idAgain ); // true
Symbol.keyFor(sym)를 사용하면 전역 심볼의 이름을 얻을 수 있습니다.
// 이름을 이용해 심볼을 찾음
let sym = Symbol.for("name");
let sym2 = Symbol.for("id");
let sym3 = Symbol("address")
// 심볼을 이용해 이름을 얻음
alert( Symbol.keyFor(sym) ); // name
alert( Symbol.keyFor(sym2) ); // id
alert( Symbol.keyFor(sym3) ); // undefined, 전역 심볼이 아님
일반 심볼에서 이름을 얻고 싶으면 description 프로퍼티를 사용하면 됩니다.
let sym3 = Symbol("address")
alert( sym3.description ) // address