반복자 Iterator는 객체의 내용을 열거하기 위한 구조를 갖춘 객체이다. 예를 들어 Array, String, Map, Set 등의 내장 객체는 모두 디폴트로 반복자를 갖추고 있기 때문에 for...of 명령으로 내부 요소를 열거할 수 있다.
let data_ary=['one','two','three'];
let data_str='가나다라마';
let data_map= new Map([['MON','월요일'],['TUE','화요일'],['WED','수요일']]);
for(let d of data_ary){
console.log(d); // one, two, three
}
for(let d of data_str){
console.log(d); // 가,나,다,라,마
}
for(let[key,value]of data_map){
console.log(`${key}:${value}`); // MON:월요일, TUE:화요일, WED:수요일
}
let data_ary=['one','two','three'];
let itr= data_ary[Symbol.iterator]();
let d;
while(d=itr.next()){
if(d.done){break;}
console.log(d.done); // false, false, false
console.log(d.value); // one, two, three
}
[Symbol.iterator]()
메소드는 배열 내의 요소를 열거하기 위한 반복자(Iterator객체)를 반환한다. 반복자는 다음의 요소를 꺼내기 위한 next()
메소드를 갖는다. next 메소드의 반환값은 요소의 값 자체가 아니다.
class MyIterator{
// 인수를 통해 전달된 배열을 data 프로퍼티에 설정
constructor(data){
this.data=data;
}
// 디폴트 반복자를 취득하기 위한 메소드를 정의
[Symbol.iterator](){
let current=0;
let that=this;
return{
// data 프로퍼티의 다음 요소를 취득
next(){
return current<that.data.length?
{value: that.data[current++], done: false} :
{done: true};
}
};
}
}
// MyIterator 클래스에 보관된 배열을 열거
let itr= new MyIterator(['one','two','three']);
for(let val of itr){
console.log(val); // one, two, three
}
next 메소드 안의 this는 자기 자신(반복자)를 나타낸다. 따라서 [Symbol.iterator] 메소드 안의 this를 일단 변수 that으로 대피시켜둠으로써 MyIterator 객체의 멤버에 엑세스할 수 있도록 하고 있다.
function* myGenerator(){
yield '가나다라마';
yield '바사아자차';
yield '타카파하갸';
}
for(let t of myGenerator()){
console.log(t); // 가나다라마, 바사아자차, 타카파하갸
}
let data= {red:'빨간색',yellow:'노란색'};
var proxy= new Proxy(data, {
get(target, prop){
return prop in target ? target[prop] : '?';
}
});
console.log(proxy.red); // 빨간색
console.log(proxy.nothing); // ?