[자바스크립트 필기] #17 - Symbol 이란
*이 필기는 웹 프로그래밍 튜토리얼에서 보고 작성합니다.
1. 심벌이란?
ES6에서 도입된 변경 불가능한 원시 타입의 값이다. 이 값은 절대적으로 유일무이한 값이라고 한다.
따라서 주로 이름의 충돌 위험이 없는 유일한 프로퍼티 키를 만들기 위해 사용한다.
2. 심벌 값의 생성
Symbol 함수
심벌 값은 Symbol 함수를 호출해서 생성해야한다.
// Symbol 함수를 호출해서 유일무이한 심벌 값을 생성한다.
const mySymbol = Symbol();
console.log(typeof mySymbol); // symbol
// 심벌 값은 외부로 노출되지 않아 확인할 수 없다.
console.log(mySymbol); // Symbol()
Symbol.for / Symbol.keyFor 메서드
Symbol.for 메서드는 인수로 받은 문자열을 키로 해서 전역 심벌 레지스트리에서 해당 키와 일치하는 심벌 값을 검색한다.
- 검색에 성공하면 검색된 심벌 값을 반환한다.
- 검색에 실패하면 새로운 심벌 값을 생성하여 인수로 받은 키로 전역 심벌 레지스트리에 저장한 후, 반환한다.
// 전역 심벌 레지스트리에 mySymbol이라는 키로 저장된 심벌 값이 없으면 새로운 심벌 값을 생성
const s1 = Symbol.for('mySymbol');
// 전역 심벌 레지스트리에 mySymbol이라는 키로 저장된 심벌 값이 있으면 해당 심벌 값 반환
const s2 = Symbol.for('mySymbol');
console.log(s1 === s2); // true
Symbol 함수와 다르게 Symbol.for 메서드를 사용하면 심벌 값을 단 하나 생성해서 전역 심벌 레지스트리를 통해 공유할 수 있다. 그리고 Symbol.keyFor 메서드를 사용해서 전역 심벌 레지스트리에 저장된 심벌 값의 키를 추출할 수 있다.
3. 심벌과 상수
const Direction = {
UP: Symbol('up'),
DOWN: Symbol('down'),
LEFT: Symbol('left'),
RIGHT: Symbol('right')
};
const myDirection = Direction.UP;
변경/중복될 가능성이 있는 무의미한 상수 대신 유일무이한 심벌 값을 사용할 수 있다.
4. 심벌과 프로퍼티 키
const obj = {
// 심벌 값으로 프로퍼티 키를 생성
[Symbol.for('mySymbol')]: 1
};
obj[Symbol.for('mySymbol')]; // -> 1
심벌 값을 프로퍼티 키로 사용하려면 대괄호를 사용해야한다.
이 처럼 심벌값은 유일무이하므로 이걸로 프로퍼티 키를 만들면 다른 프로퍼티 키와 절대 충돌하지 않는다.
이런 식으로 심벌 값을 프로퍼티 키로 사용해서 생성한 프로퍼티는 for ... in 문이나 Object.keys 등 메서드로 찾을 수 없다. 따라서 의도적으로 외부에 노출할 필요없는 프로퍼티를 은닉할 수 있다.
5. 심벌과 표준 빌트인 객체 확장
중복될 가능성이 없는 심벌 값으로 프로퍼티 키를 생성해 표준 빌트인 객체를 확장할 수 있다.
중복될 일이 없으니 안전하다.
6. Well-known Symbol
자바스크립트에서 기본 제공하는 빌트인 심벌 값을 Well-known Symbol 이라 부른다.
예를 들어, Array, String, Map, Set 등과 같이 순회 가능한 빌트인 이터러블은 Well-known Symbol인 Symbol.iterator를 키로 갖는 메서드를 가진다. 그리고 이 메서드를 호출하면 이터레이터를 반환하도록 되어있다.
여기까지 입니다 - 틀린 점이 있다면 꼭 지적해주세요!