[240422] 33장 Symbol

심벌이란?

  • ES6 에서 도입된 7번째 데이터 타입
  • 변경 불가능한 원시 타입
  • 다른 값과 중복되지 않는 유일무이한 값
  • 이름 충돌 위험이 없는 유일한 프로퍼티 키를 만들기 위해 사용

심벌 값의 생성

1. Symbol 함수

  • 다른 원시 값은 리터럴 표기법을 통해 값을 생성할 수 있지만, 심벌 값은 Symbol 함수를 호출하여 생성해야함
  • 이때 생성된 심벌 값은 외부로 노출되지 않아 확인 X
  • 다른 값과 절대 중복되지 않는 유일무이한 값
const mySymbol = Symbol();
console.log(typeof mySymbol); // symbol 

console.log(mySymbol); // Symbol() 
  • new 연산자와 함께 호출하지 않는다.
  • 심벌 함수에는 문자열 인수로 전달 가능 → 디버깅 용도로만 사용
  • 심벌 값도 객체에 접근하면 암묵적으로 래퍼 객체 생성
  • 문자열이나 숫자 타입으로 암묵적으로 변경 X
  • 불리언 타입은 암묵적으로 타입 변환 O

2. Symbol.for / Symbol.keyFor 메서드

  • 전달 받은 문자열을 키로 사용하여, 키와 심벌 값의 쌍들이 저장되어 있는 전역 심벌 레지스트리에서 해당 키와 일치하는 심벌 값을 검색한다.
    1. 검색에 성공하면 새로운 심벌 값을 생성하지 않고 검색된 심벌 값을 반환
    2. 검색에 실패하면 새로운 심벌 값을 생성하여 Symbol.for 메서드의 인수로 전달된 키로 전역 심벌 레지스트리에 저장한 후, 생성된 심벌 값을 반환
const s1 = Symbol.for('mySymbol');
Symbol.keyFor(s1); // mySymbol

const s2 = Symbol('foo');
Symbol.keyFor(s2); // undefined

3. 심벌과 상수

const Direction = {
	UP: 1,
	DOWN: 2,
	LEFT: 3,
	RIGHT: 4
}
  • 위 상수 값 1,2,3,4 는 변경 될 수 있으며 다른 변수 값과 중복될 수도 있다.
  • 이럴때 유일무이한 심벌 값 사용 가능

4. 심벌과 프로퍼티 키

  • 모든 문자열 또는 심벌 값으로 만들 수 있으며, 동적으로 생성 가능
  • 심벌 값을 프로퍼티 키로 사용하려면 프로퍼티 키로 사용할 심벌 값에 대괄호를 사용해야 한다.
  • 심벌 값으로 프로퍼티 키를 만들면 다른 프로퍼티 키와 절대 충돌X

5. 심벌과 프로퍼티 은닉

  • 심벌 값을 프로퍼티 키로 생성한 프로퍼티는 for …in , Object.keys, Object.getOwnPropertyNames 메서드로 찾을 수 없다.
  • 외부에 노출할 필요가 없는 프로퍼티를 은닉 가능
  • ES6에서 도입된 Object.getOwnPropertySymbols 메서드를 사용하면 심벌 값을 프로퍼티 키로 사용하여 생성한 프로퍼티를 찾을 수 있다.

6. 심벌과 표준 빌트인 객체 확장

  • 일반적으로 표준 빌트인 객체에 사용자 정의 메서드를 직접 추가하여 확장하는 것은 권장 X → 메서드 이름이 중복될 수 있음
  • 심벌을 이용하면 충돌 위험 없이 안전하게 빌트인 객체 확장 가능
Array.prototype[Symbol.for('sum')] = function () {
	return this.reduce((acc,cur) => acc+cur, 0);
};

[1,2][Symbol.for('sum')](); // 3

7. Well-known Symbol

  • 자바스크립트가 기본 제공하는 빌트인 심벌 값을 Well-known Symbol 이라 부른다.
    • 내부 알고리즘에 사용
  • 이터레이션 프로토콜을 준수하기 위해 일반 객체에 추가해야하는 메서드의 키 Symbol.iterator 는 기존 프로퍼티 키 또는 미래에 추가될 프로퍼티 키와 절대 중복되지 않을 것임

Categories:

Updated:

Leave a comment