[자바스크립트 ES6+ 기본] 20. Symbol 함수, 메소드

Speedwell🍀·2022년 2월 4일
0

Symbol 함수

for()

  • 글로벌 Symbol 레지스트리(registry)에
    • {key: value} 형태로 Symbol에 저장
    • 파라미터()의 문자열이 key가 되고 Symbol()로 생성한 값이 value가 됨
    • registry의 사전적 의미: 등록, 기록
const one = Symbol.for("sports");
log(one);

// Symbol(sports)
  • 글로벌 Symbol 레지스트리는 공유 영역
    • 다른 오브젝트에서도 사용 가능
    • 같은 key가 존재하면 등록된 값을 사용
const one = Symbol.for("sports");
const two = Symbol.for("sports");
log(one === two);
log(Symbol.for(true));

// true
// Symbol(true)

keyFor()

  • 글로벌 Symbol 레지스트리에서 Symbol의 key 값을 구함
    • 파라미터에 Symbol.for()로 등록한 Symbol 작성
const one = Symbol.for("book");
const six = Symbol.keyFor(one);
log(six);

// book
  • Symbol key 값이 존재하면
    • key 값을 반환하고
    • 존재하지 않으면 undefined 반환

Symbol 메소드

toString()

  • Symbol을 생성했던 형태를 문자열로 변환하여 반환
    • Symbol 값은 반환되지 않음
log(Symbol("100").toString());
const sym = Symbol.for("book");
log(sym.toString());

try {
  log(Symbol() + "ABC");
} catch {
  log("+로 연결 불가");
};

// Symbol(100)
// Symbol(book)
// +로 연결 불가
  • +로 문자열을 연결하면 TypeError
    • toString()으로 변환하면 연결은 되지만 Symbol 값은 연결되지 않음

description

  • Symbol.prototype.description

  • Syntax, ES2019

    • Symbol("설명").description;
    • Symbol("키").description;
    • Symbol.iterator.description;
  • Symbol 오브젝트의 주석, 설명을 반환

    • Symbol() 함수의 파라미터를 반환
log(Symbol("sports").description);
log(Symbol.for("book").description);
log(Symbol.iterator.description);

// sports
// book
// Symbol.iterator
  • toString()과 차이
log(Symbol("book").toString());
log(Symbol("").toString());
log(Symbol().toString());

log(Symbol.for("book").description);
log(Symbol("book").description);
log(Symbol("").description);
log(Symbol().description);

// Symbol(book)
// Symbol()
// Symbol()
// book
// book
// ""
// undefined

valueOf()

  • valueOf()가 프리미티브 값을 반환하지만
    • Symbol은 값을 반환하지 않고
    • Symbol을 생성한 형태를 반환
log(Symbol("100").valueOf());
log(Symbol.for("200").valueOf());

// Symbol(100)
// Symbol(200)
  • Symbol.for()는 for를 제외하고 반환

getOwnPropertySymbols()

  • Object 함수이지만

    • Symbol의 대상이므로 여기서 다름
  • 파라미터의 Object에서

    • Symbol만 배열로 반환
    • 다른 프로퍼티는 반환하지 않음
const obj = {point: 100};
obj[Symbol("one")] = 200;
obj[Symbol.for("two")] = 300;
log(Object.getOwnPropertySymbols(obj));
const list = Object.getOwnPropertySymbols(obj);
for (const sym of list){
  log(`${sym.description}: ${obj[sym]}`);
};

// [point]
// one: 200
// two: 300

0개의 댓글