33.1 심벌이란?
- ES6에서 도입된 7번째 데이터 타입, 변경 불가능한 원시 타입의 값
- 다른 값과 중복되지 않는 유일무이한 값
- 주로 이름의 충돌 위험이 없는 유일한 프로퍼티 키 만들기 위해 사용
- 프로퍼티 키로 사용할 수 있는 값은 빈 문자열을 포함하는 모든 문자열 or 심벌 값
33.2 심벌 값의 생성
- Symbol 함수
- 심벌 값은 Symbol 함수 호출하여 생성
- 리터럴 표기법으로 값 생성 불가
- 생성된 심벌 값은 외부로 노출되지 않아 확인 불가, 다른 값과 절대 중복되지 않는 유일무이한 값
- new 연산자와 함께 호출하지 않음 (생성자 함수가 아님)
- 선택적으로 문자열을 인수로 전달 가능
- 문자열은 생성된 심벌 값에 대한 설명으로 디버깅 용도로만 사용됨
- 심벌 값 생성에 영향 주지 않음
- 심벌도 암묵적으로 래퍼 객체 생성
- 심벌 값은 암묵적으로 문자열이나 숫자 타입으로 변환되지 않음
- 하지만, 불리언 타입으로는 암묵적으로 타입 변환됨
- if 문 등에서 존재 확인 가능
- Symbol.for / Symbol.keyFor 메서드
- Symbol.for
- 인수로 전달받은 문자열을 키로 사용하여 키와 심벌 값의 쌍들이 저장되어 있는 전역 레지스트리에서
해당 키와 일치하는 심벌 값 검색
- 검색 성공 시 검색된 심벌 값 반환
- 검색 실패 시 새로운 심벌 값 생성하여 인수로 전달된 키로 전역 심벌 레지스트리에 저장한 후,
생성된 심벌 값 반환
- 애플리케이션 전역에서 중복되지 않는 유일무이한 상수인 심벌 값을 단 하나만 생성하여,
전역 심벌 레지스트리를 통해 공유 가능
- Symbol.keyFor
- 전역 심벌 레지스트리에 저장된 심벌 값의 키 추출 가능
33.3 심벌과 상수
- 변경/중복될 가능성이 있는 무의미한 상수 대신 중복될 가능성이 없는 유일무이한 심벌 값 사용 가능
- JS에서는 enum 지원 X (TS는 가능)
33.4 심벌과 프로퍼티 키
- 심벌 값을 프로퍼티 키로 사용하려면 프로퍼티 키로 사용할 심벌 값에 대괄호 사용해야 함
- 프로퍼티 접근할 때도 대괄호 이용해야 함
- 심벌 값은 유일무이한 값으로 절대로 다른 프로퍼티 키와 충돌하지 않음
33.5 심벌과 프로퍼티 은닉
- 심벌 값을 프로퍼티 키로 사용하여 생성한 프로퍼티는 for ... in 문이나
Object.keys, Object.getOwnPropertyNames 메서드로 찾을 수 없음
- 외부에 노출할 필요 없는 프로퍼티 은닉 가능
- ES6 Object.getOwnPropertySymbols 메서드 사용하면 심벌 키로 되어 있는 프로퍼티 찾기 가능
33.6 심벌과 표준 빌트인 객체 확장
- 일반적으로 표준 빌트인 객체는 읽기 전용으로 사용하는 것이 좋음 (확장 권장 X)
- 개발자가 직접 추가한 메서드와 미래에 표준 사양으로 추가될 메서드의 이름 중복 가능성
- 중복될 가능성 없는 심벌 값으로 프로퍼티 키 생성하여 표준 빌트인 객체 확장하면,
표준 빌트인 객체의 기존 프로퍼티 키와 충돌하지 않음! (안전하게 표준 빌트인 객체 확장 가능)
- 심벌 값으로 프로퍼티 키 동적으로 생성!
33.7 Well-known Symbol
- JS가 기본 제공하는 빌트인 심벌 값 (Well-known Symbol)
- Symbol 함수의 프로퍼티에 할당되어 있음
- 빌트인 이터러블 객체는 Well-known Symbol인 Symbol.iterator를 키로 갖는 메서드를 가지며,
Symbol.iterator 메서드 호출 시 이터레이터 반환 (이터레이션 프로토콜)
- 심벌은 중복되지 않는 상수 값 생성 + 기존에 작성된 코드에 영향 주지 않고,
새로운 프로퍼티 추가하기 위해, 즉 하위 호환성 보장 위해 도입됨
'Books > 모던 JS Deep Dive ✔️' 카테고리의 다른 글
[모던 JS Deep Dive] 35장 - 스프레드 문법 (0) | 2022.01.20 |
---|---|
[모던 JS Deep Dive] 34장 - 이터러블 (0) | 2022.01.19 |
[모던 JS Deep Dive] 32장 - String (0) | 2022.01.19 |
[모던 JS Deep Dive] 31장 - RegExp (0) | 2022.01.19 |
[모던 JS Deep Dive] 30장 - Date (0) | 2022.01.15 |
댓글