모던 자바스크립트 Deep Dive - 33. Symbol

둡둡·2024년 2월 22일

Modern Javascript Deep Dive

목록 보기
34/49

33.1. 심벌이란?

  • ES6에서 도입된 7번째 데이터 타입
  • 변경 불가능한 원시 타입
  • 다른 값과 중복되지 않는 유일무이한 값, 유일한 프로퍼티 키를 만들기 위해 사용
  • 빈 문자열을 포함하는 모든 문자열 또는 심벌 값을 프로퍼티 키로 사용할 수 있음

33.2. 심벌 값의 생성

33.2.1. Symbol 함수

  • 리터럴 표기법 사용 불가, new 연산자 없음
  • Symbol 함수 호출로만 생성하는 변경 불가능한 원시 값
  • 심벌 값은 외부로 노출되지 않으며, 다른 값과 중복되지 않는 유일무이한 값
  • 문자열 인수로 전달 가능
    • 심벌 값에 대한 설명으로 디버깅 용도로만 사용됨
    • 심벌 값 생성에는 영향 없음
  • 객체처럼 접근하면 암묵적으로 래퍼 객체 생성함
    • 문자열이나 숫자 타입 변환은 X, boolean O
const mySymbol1 = Symbol('mySymbol');
const mySymbol2 = Symbol('mySymbol');

console.log(typeof mySymbol1); // symbol
console.log(mySymbol1); // Symbol()
console.log(mySymbol1 === mySymbol2); // false

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

  • Symbol.for : 인수로 전달받은 문자열을 키로 사용하여 심벌 값 검색
    • 전역 심벌 레지스트리에서 해당 키로 저장된 심벌 값이 없으면 새로운 심벌 값 생성
    • 전역 심벌 레지스트리에서 해당 키로 저장된 심벌 값이 있으면 해당 심벌 값을 반환
  • Symbol 함수는 유일무이한 심벌 값을 생성함
    • Symbol 함수는 생성한 심벌 값을 전역 레지스트리에 등록되어 관리되지 않는다 (무슨말?)
    • Symbol.for 메서드를 사용하여 전역에서 중복되지 않는 심벌 값을 공유 가능
  • Symbol.keyFor : 전역 심벌 레지스트리에 저장된 심벌 값의 키 추출 가능

33.3. 심벌과 상수

  • 값보다 이름에 의미가 있을 때 심벌로 상수 값을 생성함
  • 자바스크립트에서 지원하지 않는 enum 유사하게 구현 가능

33.4. 심벌과 프로퍼티 키

  • 심벌 값으로 프로퍼티 키를 동적 생성 가능
    • 생성 및 접근 시 대괄호 사용
    • 다른 프로퍼티 키와 절대 충돌하지 않음

33.5. 심벌과 프로퍼티 은닉

  • 프로퍼티 키를 심벌로 생성한 경우 for...in 문이나 Object.keys 메서드 사용 불가
  • 외부에 노출하지 않는 프로퍼티로 은닉 가능
  • ES6 도입된 Object.getOwnPropertySymbols 메서드로 접근 가능

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

  • 일반적으로 표준 빌트인 객체에 사용자 정의 메서드 추가하는 것은 권장하지 않음
  • 미래에 표준 사양으로 추가될 메서드 이름과 중복될 가능성 있음
    • 심벌 값으로 프로퍼티 키를 생성하여 확장하면 충돌 위험이 없음

33.7. Well-known Symbol

  • Well-known Symbol : 자바스크립트가 기본 제공하는 빌트인 심벌 값
  • 자바스크립트 엔진의 내부 알고리즘에 사용
    • Array, String, Map 등과 같이 for...of 순회 가능한 빌트인 이터러블은 Symbol.iterator 키를 갖는 등 이터레이션 프로토콜을 준수함
  • Symbol.iterator : 키로 갖는 메서드를 객체에 추가하여 구현하면 이터러블 객체가 됨
  • 심벌은 중복되지 않는 상수 값을 생성하고, 기존 작성된 코드에 영향을 주지 않는 하위 호환성을 보장하기 위해 도입됨

[출처] 모던 자바스크립트, Deep Dive

profile
괴발개발라이프

0개의 댓글