Symbol.for / Symbol.keyFor 메서드
- Symbol 함수는 호출될 때마다 유일무이한 심벌 값을 생성하기에, 동일한 인자에 대해 동일한 값으로 이용하기 위해 Symbol.for 을 이용할 수 있음
- Symbol.for 메서드는 인수로 전달받은 문자열을 키로 사용하여 키와 심벌 값의 쌍들이 지정되어 있는 전역 심벌 레지스트리에서 해당 키와 일치하는 심벌 값을 검색함
- 검색에 성공하면 새로운 심벌 값을 생성하지 않고 검색된 심벌 값을 반환
- 검색에 실패하면 새로운 심벌 값 생성, 전역 심벌 레지스트리에 저장 후, 반환
사용 사례
심벌과 상수
- 위 예제와 같이 값에는 특별한 의미가 없고 상수 이름 자체에 의미가 있는 경우가 있는데 이 때 문제는 상수 값 1, 2, 3, 4 가 변경될 수 있고, 다른 변수 값과 중복될 수도 있다는 것임
- 변경/중복될 가능성이 있는 무의미한 상수 대신 중복될 가능성이 없는 유일무이한 심벌 값을 사용할 수 있음
ENUM
- 자바스크립트는 enum을 지원하지 않지만 C, 자바, 파이썬, 등 여러 프로그래밍 언어와 자바스크립트의 상위 호환인 타입스크립트에서는 enum 을 지원함
Object.freeze
메서드(객체의 변경을 방지하기 위해 객체를 동결)와심벌 값
을 사용
심벌과 프로퍼티 키
- 객체의 프로퍼티 키는 빈 문자열을 포함하는 모든 문자열 또는 심벌 값으로 만들 수 있으며, 동적으로 생성할 수도 있음
- 심벌 값을 프로퍼티 키로 사용하려면 프로퍼티 키로 사용할 심벌 값에 대괄호를 사용해야 함
- 유일무이한 값이기에 다른 프로퍼티 키와 절대 충돌하지 않음
심벌과 프로퍼티 은닉
- 심벌 값을 프로퍼티 키로 사용하여 생성한 프로퍼티는 for … in 문이나 Object.keys, Object.getOwnPropertyNames 메서드로 찾을 수 없음
- 이처럼 심벌 값을 프로퍼티 키로 사용하여 프로퍼티를 생성하면 외부에 노출할 필요가 없는 프로퍼티를 은닉할 수 있음
- ES6 에서 도입된 Object.getOwnPropertySymbols 메서드를 사용하면 Symbol 값을 프로퍼티 키로 사용하여 생성한 프로퍼티를 찾을 수 있음
심벌과 표준 빌트인 객체 지향
- 일반적으로 표준 빌트인 객체에 사용자 정의 메서드를 직접 추가하여 확장하는 것은 권장하지 않음(중복될 수 있기 때문에). 표준 빌트인 객체는 읽기 전용으로 사용하는 것이 좋다
- 그러나 심벌을 이용해서 확장을 하게 되면 중복될 일은 없기에 안전하게 확장은 가능함
Well-known Symbol
- 자바스크립트가 기본으로 제공하는 빌트인 심벌 값을 ECMAScript 사양에서는 Well-known Symbol 이라 부름
- 예를 들어 Array, String, Map, Set, TypedArray, arguments, NodeList, HTMLCollection 과 같이 for … of 문으로 순회 가능한 빌트인 이터러블은 Well-known Symbol 인 Symbol.iterator를 키로 갖는 메서드를 가짐
- Symbol.iterator 메서드를 호출하면 이터레이터를 반환하도록 ECMAScript 사양에 규정되어 있음
- 빌트인 이터러블은 이 규정 즉, 이터레이션 프로토콜을 준수함
- 빌트인 이터러블이 아닌 일반 객체를 이터러블처럼 동작하도록 구현하고 싶으면 이터레이션 프로토콜을 따르면 됨 ⇒ 즉, ECMAScript 사양에 규정되어 있는 대로 Well-known Symbol인 Symbol.iterator를 키로 갖는 메서드를 객체에 추가하고 이터레이터를 반환하도록 구현하면 그 객체는 이터러블이 된다