심볼은 이름이 같더라도 모두 별개로 취급, 그런데 이름이 같은 심볼이 같은 개체를 가리키길 원하는 경우에 사용
전역 심볼 레지스트리(global symbol registry)를 사용하여 전역 심볼 레지스트리 안에 심볼을 만들고 해당 심볼에 접근하면, 이름이 같은 경우 항상 동일한 심볼을 반환
전역 심볼 레지스트리 안에 있는 심볼이 전역 심볼
레지스트리 안에 있는 심볼을 읽거나, 새로운 심볼을 생성하려면 Symbol.for(key)
를 사용
Symbol.for(key)
를 호출하면 이름이 key인 심볼을 반환. 조건에 맞는 심볼이 레지스트리 안에 없으면 새로운 심볼 Symbol(key)을 만들고 레지스트리 안에 저장
// 전역 레지스트리에서 심볼을 읽음
let id = Symbol.for("id"); // 심볼이 존재하지 않으면 새로운 심볼을 만듬
// 동일한 이름을 이용해 심볼을 다시 읽음
let idAgain = Symbol.for("id");
// 두 심볼은 같음
alert( id === idAgain ); // true
Symbol.for(key)
에 반대되는 메서드로 Symbol.keyFor(sym)
을 사용하여 이름을 얻음-Symbol.keyFor
는 전역 심볼 레지스트리를 뒤져서 해당 심볼의 이름을 얻음
Symbol.keyFor
의 검색 범위는 전역 심볼 레지스트리
전역 심볼이 아닌 인자가 넘어오면 Symbol.keyFor
는 undefined
를 반환
let globalSymbol = Symbol.for("name");
let localSymbol = Symbol("name");
alert( Symbol.keyFor(globalSymbol) ); // name, 전역 심볼
alert( Symbol.keyFor(localSymbol) ); // undefined, 전역 심볼이 아님
alert( localSymbol.description ); // name, 일반 심볼에서는 description 프로퍼티 사용
Object.getOwnPropertySymbols(obj)
를 사용하면 모든 심볼을 보여줌Reflect.ownKeys(obj)
는 심볼형 키를 포함한 객체의 모든 키를 반환