01. 심벌이란?
💡 문자열, 숫자, 불리언, undefineds, null, 객체 타입의 6개의 타입을 잇는
ES6에 도입된 7번째 데이터 타입으로 변경 불가능한 원시 타입의 값이다.
💡 이름의 충돌 위험이 없는 유일한 프로퍼티 키를 만들기 위해 사용한다.
02. 심벌 값의 생성
1. Symbol 함수
🔹 다른 타입과 다르게, Symbol 함수를 호출하여 생성해야 한다.
🔹 다른 값과 절대 중복되지 않으며, 암묵적으로 문자열이나 숫자 타입으로 변환되지 않는다.
// Symbol 값에 대한 설명이 같더라도 유일무이한 값을 생성한다.
const mySymbol1 = Symbol('mySymbol');
const mySymbol2 = Symbol('mySymbol');
console.log(mySymbol1) // mySymbol
console.log(mySymbol1 === mySymbol2) // false
// 심벌도 래퍼 객체를 생성한다.
console.log(mySymbol1.description) // mySymbol
console.log(mySymbol1.toString()) // Symbol(mySymbol)
2. Symbol.for / Symbol.keyFor 메서드
💡 Symbol.for 메서드는 인수로 전달받은 문자열을 키로 사용하여 키, 심벌 값의 쌍들이 저장되어 있는 전역 Symbol Registry에서 해당 키와 일치하는 Symbol 값을 검색한다.
🔹 검색 성공 -> 새로운 심벌 값을 생성하지 않고 검색된 값 반환
🔹 검색 실패 -> 새로운 심벌 값 생성, Symbol.for 메서드의 인수로 전달된 키로 전역 Symbol Registry에 저장한 뒤, 생성된 심벌 값 반환
💡 Symbol.keyFor 메서드를 사용하면 전역 Symbol Registry에 저장된 값의 키 추출 가능
03. 심벌과 상수
💡 값에는 특별한 의미가 없고, 상수 이름 자체에 의미가 있는 경우 -> 변경/중복될 가능성이 없는 심벌 값을 사용할 수 있따.
04. 심벌과 프로퍼티 키
🔹 객체의 프로퍼티 키는 동적으로 생성 가능
// 심벌 값을 프로퍼티 키로 사용하려면 대괄호를 사용해야 한다.
// 다른 프로퍼티 키와 절대 충돌하지 않는다.
const obj = {
[Symbol.for('mySymbol')]: 1
};
// 프로퍼티에 접근할 때도 마찬가지로 대괄호를 사용해야 한다.
obj[Symbol.for('mySymbol')]; // 1
05. 심벌과 프로퍼티 은닉
🔹 심벌 값을 프로퍼티 키로 사용하여 프로퍼티를 생성하면, 외부에 노출할 필요가 없는 프로퍼티를 은닉할 수 있다.
🔹 하지만, ES6에서 도입된 Object.getOwnPropertySymbols 메서드를 사용하면 심벌 값을 프로퍼티 키로 사용하여 생성한 프로퍼티를 찾을 수 있다.
06. 심벌과 표준 필트인 객체 확장
🔹 일반적으로는, 표준 빌트인 객체에 사용자 정의 메서드를 직접 추가하여 확장하는 것보다, 읽기 전용으로 사용하는 것을 권장하고 있다.
➡️ 그 이유는, 미래 표준 사양으로 추가될 메서드의 이름이 중복될 가능성이 있기 때문이다.
💡 하지만 중복될 가능성이 없는 심벌 값으로는 프로퍼티 키를 생성하여 표준 빌트인 객체를 확장하면, 어떤 프로퍼티 키와도 충돌할 위험이 없어 안전하게 확장할 수 있다.
07. Well-known Symbol
🔹 자바스크립트가 기본으로 제공하는 빌트인 심벌 값은 Symbol 함수의 프로퍼티에 할당되어 있다.
📖 참고자료
