
자바스크립트가 ECMAScript로 표준화되면서 6개의 타입(문자열, 숫자, 불리언, undefined, null, 객체 타입)이 존재하게 된다.
그런데 ES6에서 7번째 데이터 타입으로 등장한 것이 있는데, 그게 바로 이번 장에서 살펴볼 Symbol(심벌) 이다.
Symbol(심벌) 은 다른 값과 중복되지 않는 유일무이한 값 으로, 주로 충돌 위험이 없는 유일한 프로퍼티 키를 만들때 사용한다.
그렇다면 변경 불가능한 원시 타입의 값인 Symbol(심벌)은 어떻게 생성할까?
| 심벌 값은 Symbol 함수를 호출하여 생성하며, 생성된 심벌 값은 외부로 노출되지 않기때문에 확인할 수가 없다.
// 심벌 값 생성
const mySymbol = Symbol()
console.log(mySymbol) // Symbol()
Symbol 함수에는 선택적으로 '문자열' 을 인수로 전달할 수 있는데, 전달하는 '문자열'은 심벌 값에 대한 설명 으로, 디버깅 용도로만 사용하며 심벌 값 생성에는 영향을 미치지 않는다.
const mySymbol = Symbol('hello')
console.log(mySymbol) // Symbol(hello)
console.log(mySymbol.description) // hello
console.log(mySymbol.toString()) // Symbol(hello)
console.log(typeof mySymbol) // symbol
console.log(typeof mySymbol.toString()) // string
| 인수로 전달받은 문자열을 '키'로 사용하여 '키'와 심벌 값의 쌍들이 저장되어 있는 전역 심벌 레지스트리에서 해당 '키'와 일치하는 심벌 값을 검색하는 메서드이다.
Symbol 함수는 호출될 때마다 유일무이한 값을 생성하는데, 생성 당시에는 심벌 값 저장소인 레지스트리에서 해당 심벌 값을 검색할 수 있는 '키'가 지정되어 있지 않기 때문에 전역 심벌 레지스트리에 등록 및 관리되지 않는다.
하지만, Symbol.for 메서드를 사용하면 전역에서 중복되지 않는 유일무이 한 심벌 값을 생성하므로 레지스트리를 통해 공유가능한 상태가 되어 관리가 가능해진다.
| 전역 심벌 레지스트리에 저장된 심벌 값의 '키'를 추출할 수 있는 메서드이다.
// Symbol.for 메서드를 사용하여 심벌 값 생성 → 관리 ✅
const s1 = Symbol.for('mySymbol')
Symbol.keyFor(s1) // mySymbol
// Symbol 함수를 사용하여 심벌 값 생성 → 관리 ❌
const s2 = Symbol('haha')
Symbol.keyFor(s2) // undefined
심벌 값은 다음과 같이 다양하게 활용될 수 있는데, 활용되는 경우들을 간단하게 살펴보자.
상수를 정의할 때 심벌 값으로 상수 값을 생성한다.프로퍼티 키 를 동적으로 생성할 수 있는데, 심벌 값을 프로퍼티 키로 사용하려면 심벌 값에 대괄호 를 사용하면 된다. (접근할 때도 대괄호 는 써주기!)for...in, Object.keys 등의 메서드로 찾을 수 없으므로 외부에 노출할 필요가 없는 프로퍼티 은닉이 가능하다.또한, 심벌 값의 몇 가지 특징으로는 다음과 같은 내용이 있다.
Well-known-Symbol 이라고 부른다.