- 심벌이란?
: ES6에서 도입된 7번째 데이터 타입으로, 변경 불가능한 원시 타입의 값
다른 값과 중복되지 않는 유일무이한 값
⇒ 이름의 충돌 위험이 없는 유일한 프로퍼티 키를 만들기 위해 사용한다.
- 심벌 값의 생성
- 변경 불가능한 원시값이기 때문에 인스턴스를 생성할 수 없고, 따라서 new 연산자와 함께 호출하지 않는다.
- 인자는 심벌 값에 대한 설명으로 디버깅 용도로만 사용되며, 심벌 값 형성에 어떠한 영향도 주지 않는다.
- 심벌 값도 객체처럼 접근하면 암묵적으로 래퍼 객체를 생성하며, 프로퍼티나 프로토타입 메서드에 접근할 수 있다.
- 값 자체는 변경할 수 없지만, 불리언 타입으로의 타입 변환은 가능하다.
- Symbol.for 메서드를 통해 전역 심벌 레지스트리에서 검색이 가능하다.
- Symbol.keyFor 메서드를 통해 전역 심벌 레지스트리에 저장된 심벌 값의 키를 추출할 수 있다.




이 때, 인수로 전달 받은 문자열을 키로 사용하며, 해당 키와 일치하는 심벌 값을 검색한다.
1) 존재하는 경우, 해당 심벌 값을 반환
2) 존재하지 않는 경우, 새로운 심벌 값을 생성

- 심벌과 상수
: 상수 이름 자체에 의미가 있는 경우, 변경/중복될 가능성이 있는 무의미한 상수 대신 중복될 가능성이 없는 유일무이한 심벌 값을 사용할 수 있다.


- 심벌과 프로퍼티 키
: 객체의 프로퍼티 키는 빈 문자열을 포함하는 모든 문자열 또는 심벌 값으로 생성 가능하다.
심벌 값으로 프로퍼티 키를 만들면 다른 프로퍼티 키와 절대 충돌하지 않는다.

- 심벌과 프로퍼티 은닉
: getOwnPropertySymbols 를 통해 심벌 값에 접근할 수 있다.


- 심벌과 표준 빌트인 객체 확장
: 표준 빌트인 객체에 사용자 정의 메서드를 추가하는 것은 권장되지 않는다.
⇒ 개발자가 직접 추가한 메서드와 미래에 표준 사양으로 추가될 메서드의 이름이 중복될 수 있기 때문이다.
ES6 이전에 개발자가 Array.prototype.find를 추가했다면, ES6에 실제로 표준 사양으로 추가되었기 때문에 덮어쓰기 되어 문제가 발생할 수 있다.
하지만..
표준 빌트인 객체에 사용자 정의 메서드가 필요하다면, 유일무이한 값인 심벌 값으로 객체를 확장한다면 충돌의 걱정이 없다.
- Well-known Symbol
: 자바스크립트가 기본 제공하는 빌트인 심벌 값을 ECMAScript 사양에서 부르는 말이다.

해당 값들은 Symbol 함수의 프로퍼티에 할당되어 있으며, 자바스크립트 엔진의 내부 알고리즘에 사용된다.