const symbol = Symbol(description);
Symbol.for(key) 메서드는 인수로 받은 문자열을 키로하여, 전역 심벌 레지스트리에서 일치하는 심벌 값을 검색한다.
Symbol()
로 생성한 심벌은 전역 심벌 레지스트리에 등록되지 않는다.
Symbol.keyFor(var) : 전역 심벌 레지스트리에 등록된 심벌 값의 키를 추출한다.
값 자체에 의미가 없고 구분하기 위한 상수 자체가 목적인 경우에 중복될 가능성이 없는 심벌을 사용할 수 있다.
프로퍼티의 키로도 가능하다.
[Symbol.for('desc')]
처럼 키를 갖는다.은닉가능하다.
Object.getOwnPropertySymbols()
에 의해 드러난다.충돌 위험을 없애는 유일한 방법은 아니다.
유일한 점들
["inde" + "x"]
같은 방식으로도 접근이 가능하지만 심벌은 하나의 방법만으로 접근이 가능함빈번히 쓰이진 않는다고 한다.
const iterable = {
[Symbol.iterator]() {
let pre = 0,
cur = 1;
let max = 100;
return {
next() {
[pre, cur] = [cur, pre + cur];
return { value: cur, done: cur > max };
},
};
},
};
for (const num of iterable) console.log(num);
간단한 예시이다.
Iteration protocol: iterable한 자료구조라면 있어야 하는 규칙
요약: 이터러블 호출 시 이터레이터를 리턴하는데, 이는 포인터와 비슷하다. 이터레이터는 값과 언제끝나는 지를 나타내는 next 메서드를 갖고있다.
이터러블 프로토콜을 준수한 객체
Array
, Set
, Map
일반 객체도 TC39 stage 4의 스프레드 프로퍼티 제안에 따라 스프레드 문법 사용은 가능하다.
const obj = {a:1}; const obj2 = {...obj}; // obj의 복사 (주소 공유 X)
Array[Symbol.iterator]()
은 이터레이터for of
문은 불가능하다.Array
, Set
, Map
등const fibonacci = function(max) {
[Symbol.iterator]() {
let pre = 0,
cur = 1;
return {
next() {
[pre, cur] = [cur, pre + cur];
return { value: cur, done: cur > max };
},
};
},
};
for (const num of iterable(100)) console.log(num);
위 처럼 외부에서 인자 전달이 가능하다.
const fibonacci = function (max) {
let [pre, cur] = [0, 1];
return {
next() {
[pre, cur] = [cur, pre + cur];
return { value: cur, done: cur > max };
},
[Symbol.iterator]() {
return this;
},
};
};
이터러블이면서 이터레이터로도 생성 가능하다.