1. Symbol함수: for(), keyFor()


for()

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c6bb8958-008a-4955-98fa-e67a69f2d2ec/Untitled.png

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)

  1. const one = Symbol.for("sports");

    ⇒ Symbol.for("sports")에서 sports는 key가되고 Symbol("sports")의 value값이 value가 되어 global symbol registry 오브젝트에 저장되고 value값은 one에 설정됩니다.

  2. const two = Symbol.for("sports");

    ⇒ 우선 global symbol registry 오브젝트에 "sports" 라는 key가 존재하는지 검사합니다. 그 결과 위에서 등록한 key값이 있으며 그렇기에 새로운 Symbol값을 생성하지 않고 기존에 만든 Symbol값을 그대로 사용하며 상수 two에는 해당 값을 설정합니다.

  3. console.log(one === two);

    ⇒ one 과 two 모두 global symbol registry 오브젝트에 할당된 동일한 key의 값을 설정했기때문에 타입까지 비교해도 true가 나옵니다.

  4. console.log(Symbol.for(true));

    ⇒ true를 문자열로 변환하여 key값으로 설정합니다.

keyFor()

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a48abbbd-6c57-46b2-97f0-c61d127748df/Untitled.png

global symbol registry 오브젝트에서 Symbol의 key값을 구합니다. 파라미터 값으로 Symbol.for()로 등록한 Symbol을 작성하면 해당 Symbol의 key값이 반환됩니다. 만약, key가 없다면 undefined가 반환됩니다.