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을 생성했던 형태를 문자열로 변환하여 반환
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 오브젝트의 주석, 설명을 반환
log(Symbol("sports").description);
log(Symbol.for("book").description);
log(Symbol.iterator.description);
// sports
// book
// Symbol.iterator
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 함수이지만
- 파라미터의 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