JS

14 JS 심볼형

와라리요 2022. 11. 9. 22:31

 - 객체 프로퍼티 키로 문자형과 심볼형만 허용된다. 심볼은 유일한 식별자를 만들고 싶을 때 사용된다. Symbol()을 사용해 만들 수 있다.

let symbol = Symbol(); //symbol이 새로운 심볼이 된다.

 

 - 심볼은 유일선이 보장되는 자료형이기 때문에, 동일한 값을 가진 심볼을 여러게 만들어도 그것은 동이하지 않다. ==를 이용해 비교해 보면 안다.

let sym1 = Symbol("a");
let sym2 = Symbol("a");
console.log(sym1 == sym2); // false

 

 - 심볼형은 다른 형으로 변환 되지 않는다. 그러나 toString()을 이용하면 메서드를 명시적으로 호출하고 description을 이용하면 설명만 보여준다.

let sym1 = Symbol("a");
console.log(sym1); // TypeError

let sym2 = Symbol("a");
console.log(sym2.toString()); // Symbol(a)

let sym3 = Symbol("a");
console.log(sym3.description); // a

 


 

'숨김' 프로퍼티

  - 외부 코드에서 접근이 불가능하고 값도 덮어쓸 수 없는 프로퍼티이다. 그럼 왜 사용할까요? 예를 들어 제3의 스크립트(자바스크립트 라이브러리 등)에서 동일한 내임이 있다면 제3의 스크립트에선 동이한 내임을 무시하거나 덮는 상황이 발생한다. 그것을 방지하기 위한 것이다.

 

Symbols in a literal

  객체 리터럴 '{}'을 사용해 객체를 만든 경우, 대괄호를 사용해 심볼형 키를 만들어야 된다.

예)

let id = Symbol("id");

let user = {
  name: "John",
  [id]: 123 // "id": 123은 안됨
};

 

심볼은 for...in에서 배제된다.

 - 말 그대로 for...in 반복문에 배제된다.

예)

let id = Symbol("id");
let user = {
  name: "John",
  age: 30,
  [id]: 123
};

for (let key in user) alert(key); // name과 age만 출력되고, 심볼은 출력되지 않습니다.

그런데 Object.assign은 키가 심볼인 프로퍼티를 배제하지 않고 객체 내 모든 프로퍼티를 복사합니다.

에)

let id = Symbol("id");
let user = {
  [id]: 123
};

let clone = Object.assign({}, user);

alert( clone[id] ); // 123

 


 

전역 심볼

 - 앞서 살펴본 것처럼, 심볼은 이름이 같더라도 모두 별개로 취급됩니다. 그런데 이름이 같은 심볼이 같은 개체를 가리키길 원하는 경우도 가끔 있습니다. 애플리케이션 곳곳에서 심볼 "id"를 이용해 특정 프로퍼티에 접근해야 한다고 가정해 봅시다.

  전역 심볼 레지스트리(global symbol registry) 는 이런 경우를 위해 만들어졌습니다. 전역 심볼 레지스트리 안에 심볼을 만들고 해당 심볼에 접근하면, 이름이 같은 경우 항상 동일한 심볼을 반환해줍니다.

  레지스트리 안에 있는 심볼을 읽거나, 새로운 심볼을 생성하려면 Symbol.for(key)를 사용하면 됩니다.

  이 메서드를 호출하면 이름이 key인 심볼을 반환합니다. 조건에 맞는 심볼이 레지스트리 안에 없으면 새로운 심볼 Symbol(key)을 만들고 레지스트리 안에 저장합니다.

예)

// 전역 레지스트리에서 심볼을 읽습니다.
let id = Symbol.for("id"); // 심볼이 존재하지 않으면 새로운 심볼을 만듭니다.

// 동일한 이름을 이용해 심볼을 다시 읽습니다(좀 더 멀리 떨어진 코드에서도 가능합니다).
let idAgain = Symbol.for("id");

// 두 심볼은 같습니다.
alert( id === idAgain ); // true

 

Symbol.keyFor

 - 은 전역 심볼의 이름을 찾을 때 사용된다.

예)

// 이름을 이용해 심볼을 찾음
let sym = Symbol.for("name");
let sym2 = Symbol.for("id");

// 심볼을 이용해 이름을 얻음
alert( Symbol.keyFor(sym) ); // name
alert( Symbol.keyFor(sym2) ); // id

전역 심볼이 아닌 모든 심볼은 description 프로퍼티를 이용하면 이름을 얻을 수 있다.

예)

let globalSymbol = Symbol.for("name");
let localSymbol = Symbol("name");

alert( Symbol.keyFor(globalSymbol) ); // name, 전역 심볼
alert( Symbol.keyFor(localSymbol) ); // undefined, 전역 심볼이 아님

alert( localSymbol.description ); // name

'JS' 카테고리의 다른 글

16 JS 원시값의 메서드  (0) 2022.11.11
15 JS 객체를 원시형으로 변환하기  (0) 2022.11.10
13 JS 옵셔널 체이닝 '.?'  (0) 2022.10.25
12 JS new 연산자와 생성자 함수  (0) 2022.10.21
11 JS 메서드와 this  (0) 2022.10.20