심벌
: ES6에서 도입된 7번째 데이터 타입으로 변경 불가능한 원시 타입의 값
다른 값과 중복되지 않는 유일무이한 값
-> 주로 이름의 충돌 위험이 없는 유일한 프로퍼티 키를 만들기 위해 사용
심벌 값은 Symbol 함수를 호출하여 생성
-> 이떄 생성된 심벌 값은 외부로 노출되지 않아 확인할 수 없으며, 다른 값과 절대 중복되지 않는 유일무이한 값
언뜻 보면 생성자 함수로 객쳬를 생성하는 것처럼 보이지만 new 연산자와 함께 호출하지 않음
=> new 연산자와 함께 생성자 함수 또는 클래스를 호출하면 객체(인스턴스)가 생성되지만 심벌 값은 변경 불가능한 원시 값임
선택적으로 문자열을 인수로 전달 가능
-> 디버깅 용도로만 사용되고, 심벌 값 생성에 어떠한 영향도 주지 않음
(심벌 값에 대한 설명이 같더라도 생성된 심벌 값은 다름)
객체처럼 접근하면 암묵적으로 래퍼 객체를 생성
암묵적으로 문자열이나 숫자 타입으로 변환되지 않음
(불리언 타입으로는 암묵적으로 타입 변환됨)
Symbol.for 메서드는 인수로 전달받은 문자열을 키로 사용하여 키와 심벌 값의 쌍들이 저장되어 있는 전역 심벌 레지스토리에서 해당 키와 일치하는 심벌 값을 검색
Symbol 함수는 호출될 때마다 유일무일한 심벌 값 생성 (전역 심벌 레지스트리에서 심벌 값을 검색할 수 있는 키를 지정할 수 없으므로 전역 심벌 레지스트리에 등록되어 관리되지 않음)
-> Symbol.for 사용해 애플리케이션 전역에서 중복되지 않는 유일무이한 상수인 심벌 값을 단 하나만 생성하여 전역 심벌 레지스트리를 통해 공유 가능
Symbol.keyFor 메서드를 사용하면 전역 심벌 레지스트리에 저장된 심벌 값의 키를 추출 가능
Well-known- Symbol
: ECMAScript 사양에서 부르는 이름, 자바스크립트가 기본 제공하는 빌트인 심벌 값, Symbol 함수의 프로퍼티에 할당되어있음
이터레이션 프로토콜
: for...of 문으로 순회 가능한 빌트인 이터러블
-> Symbol.iterator 메서드를 호출하면 이터레이터를 반환하도록 ECMAScript 사양에 규정되어 있고 이 규정(프로토콜)을 준수하는 것
=> 일반 객체를 이터러블처럼 동작하도록 구현하고 싶다면, ECMAScript 사양에 규정되어 있는 대로 Well-known Symbol인 Symbol. iterator를 키로 갖는 메서드를 객체에 추가하고 이터레이터를 반환하도록 구현하면 됨
(메서드의 키 Symbol.iterator는 기존 프로퍼티 키 또는 미래에 추가될 프로퍼티 키와 절대로 중복되지 않음)
심벌은 중복되지 않는 상수 값을 생성하는 것은 물론 기존에 작성된 코드에 영향을 주지 않고 새로운 프로퍼티를 추가하기 위해(하위 호환성을 보장)도입됨