生成器(Generator) :
生成器是一种特殊的函数,它可以在执行过程中暂停并返回一个中间结果,然后再次从暂停的地方继续执行。生成器函数使用function*关键字定义,其中包含一个或多个yield语句。每次调用yield语句都会返回一个中间结果,并暂停函数的执行。当生成器的next()方法被再次调用时,函数会从上次暂停的地方继续执行,直到遇到下一个yield语句或函数结束。
生成器不仅实现了Iterator接口,拥有next()方法,使其可迭代,还实现了Iterable接口,这意味着生成器对象本身就是一个可迭代对象。生成器的主要优势在于其能够按需生成值,这在处理大量数据或无限序列时特别有用,因为它可以有效地控制内存使用。
案例1
function * gen(){
yield '一只没有耳朵';
yield '一只没有尾巴';
yield '真奇怪';
}
yield 代码分隔符,将代码分块执行
let interator =gen();
interator.next(); //执行生成器语句
参数传递
let interator=gen('aaa'); 或 interator.next('aaa') 返回上一个执行next的实参
案例2
当涉及到生成器代码的应用时,一个常见的例子是实现一个无限序列生成器。这种生成器可以在需要时按需生成序列中的下一个值,而无需一次性创建整个序列。这在处理大量数据或需要无限循环的场合时非常有用。
下面是一个简单的生成器函数示例,用于生成一个无限递增的整数序列:
javascript复制代码
function* infiniteSequence() {
let count = 0;
while (true) {
yield count++;
}
}
// 使用生成器
const sequenceGenerator = infiniteSequence();
// 获取序列中的前几个值
console.log(sequenceGenerator.next().value); // 输出: 0
console.log(sequenceGenerator.next().value); // 输出: 1
console.log(sequenceGenerator.next().value); // 输出: 2
// ... 可以继续获取更多的值
在这个例子中,infiniteSequence是一个生成器函数,它使用yield关键字来返回当前的count值,并在每次调用next()方法时递增count的值。由于while循环是无限循环的,所以这个生成器可以无限生成递增的整数。
我们使用infiniteSequence()函数创建了一个生成器对象sequenceGenerator。然后,我们通过调用next()方法来获取序列中的下一个值。每次调用next()时,生成器函数会从上次暂停的地方继续执行,直到遇到下一个yield语句,并返回该语句的值。next()方法返回一个对象,其中value属性包含生成的值,done属性表示是否还有更多的值可以生成。在这个例子中,done属性将始终是false,因为生成器是无限的。
这种生成器在很多场景下都非常有用。例如,它可以用于模拟实时数据流、创建测试数据、实现延迟加载等。由于生成器是按需生成值的,所以它们在处理大量数据时可以有效地控制内存使用,避免了一次性加载整个数据集到内存中。
需要注意的是,生成器在每次调用next()方法时都会保留其内部状态(如局部变量和执行位置),这使得它们能够在多次调用之间保持连续性。这也是生成器与普通函数之间的一个重要区别。