迭代器与生成器
定义
定义:迭代器是一种特殊的对象,有一个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 }