Javascript - Symbol

김태수·2021년 8월 10일
0

기타

목록 보기
8/11

Symbol

Symbol은 ES6에서 새롭게 추가된 자바스크립트의 7번째 원시 데이터 타입이다
심벌 값은 다른값과 중복되지 않는 유일무이한 값이다. 따라서 주로 이름의 충돌 위험이 없는 유일한 프로퍼티 키를 만들기 위해 사용한다.

MDN 에서는 다음과 같이 서술하고 있다.

Symbol() 함수는 심볼(symbol) 형식의 값을 반환하는데, 이 심볼은 내장 객체(built-in objects)의 여러 멤버를 가리키는 정적 프로퍼티와 전역 심볼 레지스트리(global symbol registry)를 가리키는 정적 메서드를 가지며, "new Symbol()" 문법을 지원하지 않아 생성자 측면에서는 불완전한 내장 객체 클래스(built-in object class)와 유사합니다.

심볼의 생성

심볼은 세가지 방법으로 생성할 수 있다.

  • Symbol();
  • Symbol.for();
  • Symbol.iterator
    이 중 Symbol.iteratoriterator객체를 정의하기 위해 쓰인다.

Symbol()과 Symbol.for()의 차이점

Symbol()은 고유한 심볼을 반환한다, 하지만 Symbol.for()는 전역으로 존재하는 global symbol table의 목록을 참조하여, 아래와같이 'hello world'로 정의된 심볼이 이미 존재 한다면, 해당 심볼을 반환하고,
존재하지 않다면 해당 심볼을 생성 후, 만들어진 해당 심볼을 반환하게 된다.

const obj = {};
const mySymbol1 = Symbol.for('hello world');
const mySymbol2 = Symbol.for('hello world');
obj[mySymbol1] = 20;
console.log(obj[mySymbol2] === 20);

Symbol 속성은 열거형 속성이 아니기 때문에 for...of 문이나, Object.keys때 찾지 못한다.
Object.getOwnPropertySymbols로 찾아야 한다.
또한 JSON.stringify()에서도 무시된다.

그래서 왜 필요한데?

  • 심볼 값으로 고유한 프로퍼티 키를 만들 수 있다. 외부에 노출할 필요가 없는 프로퍼티를 은닉할 수 있다.
    다만 Object.getOwnPropertySymbols 메서드를 사용하면 심볼 값을 프로퍼티 키로 사용하여 생성한 프로퍼티를 찾을 수 있다.

  • enum 처럼 값에는 의미가 없고, 상수 이름 자체에 의미가 있는 경우가 있다. 상수 값은 변경될 수 있으며 다른 변수 값과 중복될 수 있다는 문제가 있다. 변경/중복될 가능성이 있는 무의미한 상수 대신 중복될 가능성이 없는 유일무이한 심볼 값을 사용할 수 있다.

  • 빌트인 객체에 사용자 정의 메서드를 직접 추가할 때, 다음 ECMAScript에 똑같은 이름의 메서드가 도입된다면 문제가 된다. 따라서 중복될 가능성이 없는 심볼 값으로 빌트인 객체를 확장하면 나중에 추가될지 모르는 어떤 메서드와도 충돌할 위험이 없어 안전하게 빌트인 객체를 확장할 수 있다.

profile
개발학습 일기

0개의 댓글