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);
console.log(mySymbol1);
console.log(mySymbol1 === mySymbol2);
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