[240422] 33장 Symbol
심벌이란?
- ES6 에서 도입된 7번째 데이터 타입
- 변경 불가능한 원시 타입
- 다른 값과 중복되지 않는 유일무이한 값
- 이름 충돌 위험이 없는 유일한 프로퍼티 키를 만들기 위해 사용
심벌 값의 생성
1. Symbol 함수
- 다른 원시 값은 리터럴 표기법을 통해 값을 생성할 수 있지만, 심벌 값은 Symbol 함수를 호출하여 생성해야함
- 이때 생성된 심벌 값은 외부로 노출되지 않아 확인 X
- 다른 값과 절대 중복되지 않는 유일무이한 값
const mySymbol = Symbol();
console.log(typeof mySymbol); // symbol
console.log(mySymbol); // Symbol()
- new 연산자와 함께 호출하지 않는다.
- 심벌 함수에는 문자열 인수로 전달 가능 → 디버깅 용도로만 사용
- 심벌 값도 객체에 접근하면 암묵적으로 래퍼 객체 생성
- 문자열이나 숫자 타입으로 암묵적으로 변경 X
- 불리언 타입은 암묵적으로 타입 변환 O
2. Symbol.for / Symbol.keyFor 메서드
- 전달 받은 문자열을 키로 사용하여, 키와 심벌 값의 쌍들이 저장되어 있는 전역 심벌 레지스트리에서 해당 키와 일치하는 심벌 값을 검색한다.
- 검색에 성공하면 새로운 심벌 값을 생성하지 않고 검색된 심벌 값을 반환
- 검색에 실패하면 새로운 심벌 값을 생성하여 Symbol.for 메서드의 인수로 전달된 키로 전역 심벌 레지스트리에 저장한 후, 생성된 심벌 값을 반환
const s1 = Symbol.for('mySymbol');
Symbol.keyFor(s1); // mySymbol
const s2 = Symbol('foo');
Symbol.keyFor(s2); // undefined
3. 심벌과 상수
const Direction = {
UP: 1,
DOWN: 2,
LEFT: 3,
RIGHT: 4
}
- 위 상수 값 1,2,3,4 는 변경 될 수 있으며 다른 변수 값과 중복될 수도 있다.
- 이럴때 유일무이한 심벌 값 사용 가능
4. 심벌과 프로퍼티 키
- 모든 문자열 또는 심벌 값으로 만들 수 있으며, 동적으로 생성 가능
- 심벌 값을 프로퍼티 키로 사용하려면 프로퍼티 키로 사용할 심벌 값에 대괄호를 사용해야 한다.
- 심벌 값으로 프로퍼티 키를 만들면 다른 프로퍼티 키와 절대 충돌X
5. 심벌과 프로퍼티 은닉
- 심벌 값을 프로퍼티 키로 생성한 프로퍼티는 for …in , Object.keys, Object.getOwnPropertyNames 메서드로 찾을 수 없다.
- 외부에 노출할 필요가 없는 프로퍼티를 은닉 가능
- ES6에서 도입된 Object.getOwnPropertySymbols 메서드를 사용하면 심벌 값을 프로퍼티 키로 사용하여 생성한 프로퍼티를 찾을 수 있다.
6. 심벌과 표준 빌트인 객체 확장
- 일반적으로 표준 빌트인 객체에 사용자 정의 메서드를 직접 추가하여 확장하는 것은 권장 X → 메서드 이름이 중복될 수 있음
- 심벌을 이용하면 충돌 위험 없이 안전하게 빌트인 객체 확장 가능
Array.prototype[Symbol.for('sum')] = function () {
return this.reduce((acc,cur) => acc+cur, 0);
};
[1,2][Symbol.for('sum')](); // 3
7. Well-known Symbol
- 자바스크립트가 기본 제공하는 빌트인 심벌 값을 Well-known Symbol 이라 부른다.
- 내부 알고리즘에 사용
- 이터레이션 프로토콜을 준수하기 위해 일반 객체에 추가해야하는 메서드의 키 Symbol.iterator 는 기존 프로퍼티 키 또는 미래에 추가될 프로퍼티 키와 절대 중복되지 않을 것임
Leave a comment