Symbol 함수는 호출될 때마다 유일무이한 심벌 값을 생성하기에, 동일한 인자에 대해 동일한 값으로 이용하기 위해 Symbol.for 을 이용할 수 있음
Symbol.for 메서드는 인수로 전달받은 문자열을 키로 사용하여 키와 심벌 값의 쌍들이 지정되어 있는 전역 심벌 레지스트리에서 해당 키와 일치하는 심벌 값을 검색함
검색에 성공하면 새로운 심벌 값을 생성하지 않고 검색된 심벌 값을 반환
검색에 실패하면 새로운 심벌 값 생성, 전역 심벌 레지스트리에 저장 후, 반환
const s1 = Symbol.for('mySymbol'); // mySymbol 키로 저장된 심벌 값이 없으면 새로운 심벌 값 생성
const s2 = Symbol.for('mySymbol'); // mySymbol 키로 지정된 심벌 값 있으면 해당 심벌 값을 반환
console.log(s1 === s2); // true
const s1 = Symbol.for('mySymbol');
Symbol.keyFor(s1); // -> mySymbol
const s2 = Symbol('foo');
Symbol.keyFor(s2); // -> undefined
// Symbol 함수 호출하여 생성한 심벌 값은 전역 심벌 레지스트리에 등록되어 관리되지 않음
사용 사례
심벌과 상수
const Direction = {
UP : 1,
DOWN : 2,
LEFT : 3,
RIGHT : 4
};
const myDirection = Direction.UP;
if(myDirection === Direction.UP) {
console.log('You are going UP.');
}
위 예제와 같이 값에는 특별한 의미가 없고 상수 이름 자체에 의미가 있는 경우가 있는데 이 때 문제는 상수 값 1, 2, 3, 4 가 변경될 수 있고, 다른 변수 값과 중복될 수도 있다는 것임
변경/중복될 가능성이 있는 무의미한 상수 대신 중복될 가능성이 없는 유일무이한 심벌 값을 사용할 수 있음
자바스크립트가 기본으로 제공하는 빌트인 심벌 값을 ECMAScript 사양에서는 Well-known Symbol 이라 부름
예를 들어 Array, String, Map, Set, TypedArray, arguments, NodeList, HTMLCollection 과 같이 for … of 문으로 순회 가능한 빌트인 이터러블은 Well-known Symbol 인 Symbol.iterator를 키로 갖는 메서드를 가짐
Symbol.iterator 메서드를 호출하면 이터레이터를 반환하도록 ECMAScript 사양에 규정되어 있음
빌트인 이터러블은 이 규정 즉, 이터레이션 프로토콜을 준수함
빌트인 이터러블이 아닌 일반 객체를 이터러블처럼 동작하도록 구현하고 싶으면 이터레이션 프로토콜을 따르면 됨 ⇒ 즉, ECMAScript 사양에 규정되어 있는 대로 Well-known Symbol인 Symbol.iterator를 키로 갖는 메서드를 객체에 추가하고 이터레이터를 반환하도록 구현하면 그 객체는 이터러블이 된다
const iterable = {
[Symbol.iterator]() {
let cur = 1;
const max = 5;
return {
next() {
return { value : cur++, done: cur > max + 1 };
}
};
}
};
for (const num of iterable) {
console.log(num); // 1 2 3 4 5
}