首页 迭代器与生成器
文章
取消

迭代器与生成器

迭代器与生成器

定义

定义:迭代器是一种特殊的对象,有一个next()方法,每次调用,都会返回一个结果。结果有两个属性,一个是value,表示表示下一个将要返回的值,另一个是done,它是一个布尔类型的值,表示是否还有更多可返回的值。

生成器是一种返回带迭代器的函数,定义时需要在function关键字后的星号(*),被调用时会自动创建一个迭代器,函数会用到新的关键字yield。生成器函数,每当执行完一条yield语句后函数就会自动停止执行。

1
2
3
4
5
6
7
8
9
10
function* createIterator(items) {
    for (let i = 0; i < items.length; i++) {
        yield items[i];
    }
}

let iterator = createIterator([1,2]); // 创建迭代器
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

特征

可迭代对象具有Symbol.iterator属性。生成器默认会为属性Symbol.iterator赋值,所有通过生成器创建的迭代器都是可迭代对象。

1
2
3
4
5
function isIterableObject(object) {
    return typeof object[Symbol.iterator] === `function`;
}
let iterator = createIterator([1,2]); // 创建迭代器
console.log(isIterableObject(iterator)); // true

for-of 循环每次执行一次都会调用迭代对象的next()方法,并将迭代器返回的结果对象的value属性存储在一个变量中,循环将持续执行这一过程,直返回对象的done属性的值为 true。如果只需迭代数组或集合中的值,推荐用for-of循环。

可迭代对象

默认情况下,开发者定义的对象都是比可迭代对象,但如果给Symbol.iterator 属性添加一个生成器,则可以将其变为可迭代对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let collection = {
    items: [],
    * [Symbol.iterator]() {
        for (let item of this.items) {
            yield  item;
        }
    }
};
collection.items.push(3);
collection.items.push(31);
collection.items.push(32);

for (let i of  collection) {
    console.log(i);
}

给迭代器传参

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function  *createIterator() {
    let first = yield 1 ;
    let second =  yield first + 2;
    yield second +3;
}

let iterator1 = createIterator();
console.log(iterator1.next());
console.log(iterator1.next(11));
console.log(iterator1.next(20));
console.log(iterator1.next(10));
console.log(iterator1.next());
// { value: 1, done: false }
// { value: 13, done: false }
// { value: 23, done: false }
// { value: undefined, done: true }
// { value: undefined, done: true }
本文由作者按照 CC BY 4.0 进行授权
文章内容