전역 심벌과 로컬 심벌

33장 7번째 데이터 타입 Symbol을 공부한 후 심벌에 대해 헷갈리는 부분을 추가로 정리한 내용입니다.

Symbol Key, description, Symbol 값 등등이 혼재 되어 헷갈려서 조금 더 찾아보고 정리하였다.
이를 이해하기 위해서는 전역 심벌과 로컬 심벌에 대한 이해가 필요했다.

전역 심벌과 로컬 심벌

애플리케이션 곳곳에서 심볼을 이용해서 특정 프로퍼티에 접근해야할 수도 있다.
이러한 경우를 위해서 global symbol registry가 만들어졌다.

전역 심벌 레지스트리 안에 Symbol을 만들고 해당 Symbol에 접근하면 이름이 같으면 항상 동일한 Symbol을 반환한다.
여기서 의문점이 들었다. 설명이 같아도 유일무이한 Symbol이 생성되는 거 아니였냐?

전역 심벌 레지스트리는 우리가 하는 객체처럼 key와 value에 쌍으로 symbol들이 저장된다.
즉, 여기서 말하는 Symbol 키 값은 전역 심벌 레지스트리에서의 키값이지 Symbol 그 자체를 얘기하는 것이 아니다.

이러한 전역 심벌 레지스트리 안에 있는 심볼을 global symbol이라고 부르는 것이다.
반대로 local symbol 도 있고, 이는 생성된 범위 내에서만 유일함을 보장한다.

Symbol 생성에 있어서의 차이

const mySymbol = Symbol();
Symbol.keyFor(mySymbol); //undefined

이와 같이 생성된 심벌은 로컬 심벌이다.
그렇기 때문에 심벌 key를 가지지 않는다.

하지만 Symbol.for로 생성된 symbol은 globla symbol이 된다.

const s1 = Symbol.for('mySymbol');

//global symbol registry 상상도
// 이해하기 위해 만든 상상의 구조체이며, 실제 데이터 구조와는 일치하지 않을 수 있다.
{
	mySymbol : Symbol('mySymbol');
}

현재로써는 정확한 이유는 모르겠지만, 전역 심볼을 생성할 때 Symbol key값이 Symbol의 description이 된다.

reference