# 什么是生成器
生成器是一种特殊的函数,可以在调用时暂停执行,并在需要时继续执行。它返回的是一个可迭代对象,可以使用for...of语句
或者手动迭代器来获取生成器生成的值。
# 生成器的语法
生成器函数使用function*关键字
定义,并使用yield语句
返回生成的值。下面是一个简单的例子:
function* myGenerator() {
yield 'apple';
yield 'banana';
yield 'orange';
}
1
2
3
4
5
2
3
4
5
# 使用生成器实现可迭代对象和迭代器
生成器函数返回的是一个可迭代对象,可以直接使用for...of语句
来遍历生成器生成的值:
function* myGenerator() {
yield 'apple';
yield 'banana';
yield 'orange';
}
for (let value of myGenerator()) {
console.log(value);
}
// 输出:
// apple
// banana
// orange
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
也可以使用手动迭代器来遍历生成器生成的值:
function* myGenerator() {
yield 'apple';
yield 'banana';
yield 'orange';
}
const myIterator = myGenerator();
console.log(myIterator.next()); // { value: "apple", done: false }
console.log(myIterator.next()); // { value: "banana", done: false }
console.log(myIterator.next()); // { value: "orange", done: false }
console.log(myIterator.next()); // { done: true }
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
生成器函数也可以用来实现自定义的可迭代对象和迭代器,例如:
function* myGenerator(max) {
let i = 0;
while (i < max) {
yield i;
i++;
}
}
const myIterable = {
[Symbol.iterator]: function() {
return myGenerator(5);
}
};
for (let value of myIterable) {
console.log(value);
}
// 输出:
// 0
// 1
// 2
// 3
// 4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24