Symbol

zimablue·2023년 10월 17일

javascript

목록 보기
26/30

symbol은 유일한 식별자를 만들고 싶을 때 사용합니다.


symbol은 new를 붙이지 않고 사용합니다.

let id = Symbol();

심볼을 만들 때 심볼 이름이라 불리는 설명을 붙일 수도 있습니다.
설명은 어떤 것에도 영향을 주지 않는 이름표 역할만을 합니다.

let id = Symbol("id");

유일성이 보장되는 자료형이기 때문에, 설명이 동일한 심볼을 여러 개 만들어도 각 심볼값은 다릅니다.

let a = Symbol('id');
let b = Symbol('id');

console.log(a) // Symbol(id)
console.log(b) // Symbol(id)

alert(a == b); // false
alert(a === b); // false





Hidden Property Key


Hidden Property는 외부 코드에서 접근이 불가능하고 값도 덮어쓸 수 없는 프로퍼티입니다.


객체의 키를 심볼로 사용할 수 있습니다.

let user = {
  name: "zima"
};

let id = Symbol("id");

user[id] = 1;

alert( user[id] ); // 1



심볼은 유일성이 보장되므로 이름이 같더라도 우리가 만든 식별자와 제3의 스크립트에서 만든 식별자가 충돌하지 않습니다.


객체의 키 네임 id가 중복되어 기존 값이 덮어 쓰여졌습니다.

let user = { name: "zima" };

user.id = "스크립트 id 값";

user.id = "제3 스크립트 id 값"

user; // {name: 'John', id: '제3 스크립트 id 값'}

객체의 키 네임 id가 중복되었지나 기존 값이 사라지지 않았습니다.

let user = {
  name: "John"
};

let id = Symbol("id");

user[id] = "스크립트 id 값";

user.id = "제3 스크립트 id 값";

user; // {name: 'John', id: '제3 스크립트 id 값', [Symbol(id)]: '스크립트 id 값'}



Symbols in a literal

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

const id = Symbol('id'); // 객체 리터럴로 symbol 생성

const user = {
  name: 'Zima',
  age: 100,
  [id] : 'myid' // 대괄호 사용
}

user // {name: 'Zima', age: 100, Symbol(id) : 'myid'}
user[id] // "myid"

Object.keys(user); // ["name", "age"]





전역 심볼(Symbol.for(key))


이름이 같은 심볼이 같은 개체를 가리키길 원하는 경우 Symbol.for을 사용할 수 있습니다;
Symbol은 매번 다른 Symbol 값을 생성하지만, Symbol.for 메서드는 하나를 생성한 뒤 키를 통해 같은 Symbol을 공유합니다.
전역 심볼 레지스트리(global symbol registry) 안에 해당 이름의 심볼이 없다면 만들고, 있다면 가져오기 때문에 하나의 심볼만 보장받을 수 있습니다.

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

// 동일한 이름을 이용해 심볼을 다시 읽습니다
let idAgain = Symbol.for("id");

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





Symbol.keyFor


Symbol.keyFor(sym)를 사용하면 전역 심볼의 이름을 얻을 수 있습니다.

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

// 심볼을 이용해 이름을 얻음
alert( Symbol.keyFor(sym) ); // name
alert( Symbol.keyFor(sym2) ); // id
alert( Symbol.keyFor(sym3) ); // undefined, 전역 심볼이 아님



description

일반 심볼에서 이름을 얻고 싶으면 description 프로퍼티를 사용하면 됩니다.

let sym3 = Symbol("address")

alert( sym3.description ) // address

0개의 댓글