生成器

1/16/2023

# 什么是生成器

生成器是一种特殊的函数,可以在调用时暂停执行,并在需要时继续执行。它返回的是一个可迭代对象,可以使用for...of语句或者手动迭代器来获取生成器生成的值。

# 生成器的语法

生成器函数使用function*关键字定义,并使用yield语句返回生成的值。下面是一个简单的例子:

function* myGenerator() {
  yield 'apple';
  yield 'banana';
  yield 'orange';
}
1
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

也可以使用手动迭代器来遍历生成器生成的值:

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

生成器函数也可以用来实现自定义的可迭代对象和迭代器,例如:

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
编辑时间: 1/25/2023, 4:05:20 PM