이터레이터

const iterator = {
    current: 0,
    last: 5,
    next() {
        if (this.current <= this.last) {
            return { value: this.current++, done: false };
        } else {
            return { value: undefined, done: true };
        }
    }
};

console.log(iterator.next()); // { value: 0, done: false }
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: 4, done: false }
console.log(iterator.next()); // { value: 5, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

제네레이터

function* generator() {
    yield 1;
    yield 2;
    yield 3;
}

const gen = generator();

console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: 3, done: false }
console.log(gen.next()); // { value: undefined, done: true }

이터러블

const iterable = {
    [Symbol.iterator]() {
        let step = 0;
        return {
            next() {
                if (step < 3) {
                    return { value: step++, done: false };
                } else {
                    return { value: undefined, done: true };
                }
            }
        };
    }
};

for (const value of iterable) {
    console.log(value); // 0, 1, 2
}