[learning javascript] chapter 12. 이터레이터와 제너레이터

이터레이터와 제너레이터

// it1으로 두 페이지를 읽음 it1.next(); // { value: “Twinkle. twinkle, little bat!”, done: false } it1.next(); // { value: “How I wonder what you’re at!”, done: false }

// it2로 한 페이지 읽음 it2.next(); // { value: “Twinkle. twinkle, little bat!”, done: false }

// it1로 한 페이지 더 읽음 it1.next(); // { value: “Up above the world you fly,”, done: false }


## 이터레이션 프로토콜
- 이터레이터는 그 자체보다는 더 쓸모 있는 동작이 가능해지도록 한다는 데 의미가 있음
- 이터레이터 프로토콜은 모든 객체를 이터러블 객체로 바꿀 수 있음
- 메시지에 타임스탬프를 붙이는 로그 클래스
```javascript
class Log {
    constructor() {
        this.messages = [];
    }
    add(message) {
        this.messages.push({ message, timestamp: Date.now() });
    }
}

// 로그를 배열처럼 순회 for(let entry of log) { console.log(${entry.message} @ ${entry.timestamp}); }

- 직접 이터레이터를 만들 수도 있음
```javascript
class Log {
    constructor() {
        this.messages = [];
    }
    add(message) {
        this.messages.push({ message, timestamp: Date.now() });
    }
    [Symbol.iterator]() {
        let i = 0;
        const messages = this.messages;
        return {
            next() {
                if(i >= messages.length)
                    return { value: undefined, done: true };
                return { value: messages[i++], done: false };
            }
        };
    }
}

제너레이터

yield 표현식과 양방향 통신

제너레이터와 return

const it = abc(); it.next(); // { value: ‘a’, done: false } it.next(); // { value: ‘b’, done: false } it.next(); // { value: ‘c’, done: true } ```