TIL_20210402

ChungsikPark·2021년 4월 2일
0

TIL

목록 보기
23/31

전역 심볼

  • 심볼은 이름이 같더라도 모두 별개로 취급, 그런데 이름이 같은 심볼이 같은 개체를 가리키길 원하는 경우에 사용

  • 전역 심볼 레지스트리(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.keyFor

  • Symbol.for(key)에 반대되는 메서드로 Symbol.keyFor(sym)을 사용하여 이름을 얻음

-Symbol.keyFor는 전역 심볼 레지스트리를 뒤져서 해당 심볼의 이름을 얻음

  • Symbol.keyFor의 검색 범위는 전역 심볼 레지스트리

  • 전역 심볼이 아닌 인자가 넘어오면 Symbol.keyForundefined를 반환

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)는 심볼형 키를 포함한 객체의 모든 키를 반환
profile
Blog by Chungsik Park

0개의 댓글