심볼형

양주영·2021년 8월 22일
0

javascript

목록 보기
3/42

📍 심볼


  • '심볼(symbol)'은 객체속성을 만들 수 있는 원시 데이터 형식(primitive data type)이다.
  • 유일한 식별자(unique identifier)를 만들고 싶을 때 사용한다.

Symbol()을 사용하면 심볼값을 만들 수 있다.
Symbol()은 함수이지만, 생성자 함수는 아니다. 호출될 때 새로운 Symbol 값을 반환한다.


심볼을 만들 때 심볼 이름이라 불리는 설명을 붙일 수도 있다.

// 심볼 id에는 "id"라는 설명이 붙습니다.
let id = Symbol("id");

심볼은 유일성이 보장되는 자료형이기 때문에 설명이 동일한 심볼을 만들더라도 각각 다른 심볼값이다.
설명이 같은 심볼 두 개를 만들고 비교했을 때, false가 반환된다.

let id1 = Symbol("id");
let id2 = Symbol("id");

alert(id1 == id2); // false

또한, 자바스크립트에서는 문자형으로의 암시적 형변환이 자유롭게 일어나지만, 심볼은 예외다.
심볼형 값은 다른 자료형으로 암시적 형 변환(자동 형 변환)되지 않는다.

심볼을 반드시 출력해줘야 하는 상황이라면 아래와 같이 .toString() 메서드를 호출해주면 된다.

let id = Symbol("id");
alert(id.toString()); // Symbol(id)가 얼럿 창에 출력됨


📍 숨김 프로퍼티


심볼을 이용하면 ‘숨김(hidden)’ 프로퍼티를 만들 수 있다.
숨김 프로퍼티는 외부 코드에서 접근이 불가능하고 값도 덮어쓸 수 없는 프로퍼티이다.

심볼은 서드파티코드에서 접근할 수 없기 때문에 심볼을 사용하게 되면 서드파티 코드가 user에 식별자를 부여한다.

let user = { // 서드파티 코드에서 가져온 객체
  name: "John"
};

let id = Symbol("id");

user[id] = 1;

alert( user[id] ); // 심볼을 키로 사용해 데이터에 접근할 수 있습니다.

Symbol은 for...in 반복문에 포함될 수 없다.

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

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


📍 전역 심볼


이름이 같은 심볼이 같은 객체를 가리키길 원할 때를 위해 만들어졌다.
이름이 같은 경우 항상 동일한 심볼을 반환해준다.

전역 심볼을 찾을 땐 Symbol.for(key)를 사용하면 된다.
이 메소드를 호출하면 이름이 key인 심볼을 반환해준다.

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

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

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

Symbol.keyFor

전역 심볼을 찾을 때 사용되는 Symbol.for(key)에 반대되는 메서드도 있다. Symbol.keyFor(sym)를 사용하면 이름을 얻을 수 있다.

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

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


📍 시스템 심볼


'시스템 심볼(system symbol)'은 자바스크립트 내부에서 사용되는 심볼이다.

  • Symbol.hasInstance
  • Symbol.isConcatSpreadable
  • Symbol.iterator
  • Symbol.toPrimitive


📝 정리


  • Symbol은 원시형 데이터로, 유일무이한 식별자를 만드는 데 사용된다.

  • Symbol()을 호출하면 심볼을 만들 수 있다. 설명(이름)은 선택적으로 추가할 수 있다.

  • 심볼은 이름이 같더라도 값이 항상 다르다.이름이 같을 때 값도 같길 원한다면 전역 레지스트리를 사용해야 한다.

  • Symbol.for(key)는 key라는 이름을 가진 전역 심볼을 반환한다.

참조 : https://ko.javascript.info/symbol

profile
뚜벅뚜벅

0개의 댓글