for()함수는 글로벌Symbol 레지스트리에 {key: value} 형태로 Symbol을 저장합니다. 파라미터()의 문자열이 key가 되고 Symbol()로 생성한 값이 value가 됩니다.
const one = Symbol.for("sports");
console.log(one);//Symbol(sports)
이는 이전에 사용하던 Symbol("sports")와 차이가 있는데, 기존에 Symbol("주석")에서는 파라미터가 주석이였습니다. 하지만 for함수에서는 파라미터가 key로 사용됩니다.
즉, Symbol.for("sports")는 글로벌 Symbol 레지스트리 오브젝트에 {"sports": Symbol(sports)}로 저장되어있다는 의미가 됩니다.
이렇게 for()함수로 저장되는 key:value는 글로벌 Symbol 레지스트리 오브젝트에 저장되는데 이 영역은 이름의 시맨틱(글로벌) 그대로 전역적으로 공유됩니다. 그렇기에 다른 오브젝트에서도 해당 Symbol을 사용할 수 있습니다.
key가 같을 경우 등록된 값을 사용할 수 있습니다.
const one = Symbol.for("sports");
const two = Symbol.for("sports");
console.log(one === two);
console.log(Symbol.for(true));
[실행 결과]
true
Symbol(true)
const one = Symbol.for("sports");
⇒ Symbol.for("sports")에서 sports는 key가되고 Symbol("sports")의 value값이 value가 되어 global symbol registry 오브젝트에 저장되고 value값은 one에 설정됩니다.
const two = Symbol.for("sports");
⇒ 우선 global symbol registry 오브젝트에 "sports" 라는 key가 존재하는지 검사합니다. 그 결과 위에서 등록한 key값이 있으며 그렇기에 새로운 Symbol값을 생성하지 않고 기존에 만든 Symbol값을 그대로 사용하며 상수 two
에는 해당 값을 설정합니다.
console.log(one === two);
⇒ one 과 two 모두 global symbol registry 오브젝트에 할당된 동일한 key의 값을 설정했기때문에 타입까지 비교해도 true가 나옵니다.
console.log(Symbol.for(true));
⇒ true를 문자열로 변환하여 key값으로 설정합니다.
global symbol registry 오브젝트에서 Symbol의 key값을 구합니다. 파라미터 값으로 Symbol.for()로 등록한 Symbol을 작성하면 해당 Symbol의 key값이 반환됩니다. 만약, key가 없다면 undefined가 반환됩니다.