ES6生成器是JavaScript中的一项强大特性,它允许您在函数执行期间暂停和恢复代码的执行。生成器函数使用function*
语法进行声明,并使用yield
关键字来产生(yield)值。
工作原理
生成器函数在被调用时不会立即执行,而是返回一个称为生成器对象的迭代器。通过调用生成器对象的next()
方法,可以迭代执行生成器函数的代码,每次调用都会将控制权交给生成器函数的下一个yield
语句。生成器对象还具有其他方法,如return()
和throw()
,用于控制生成器的执行。
在每次调用生成器对象的next()
方法时,生成器函数都会执行,直到遇到一个yield
语句。yield
语句的值将作为next()
方法的返回值,并将生成器函数的执行暂停在该位置。下次调用next()
方法时,生成器函数将从上次暂停的位置继续执行,直到再次遇到下一个yield
语句或函数结束。
语法
以下是ES6生成器函数的基本语法:
代码语言:javascript复制function* generatorFunction() {
// 生成器函数的代码
yield value;
}
- 使用
function*
关键字声明生成器函数。 - 生成器函数体内使用
yield
关键字来指定要产生的值。
示例
让我们通过一些示例来理解ES6生成器的使用。
示例1:生成器迭代器
代码语言:javascript复制function* numberGenerator() {
yield 1;
yield 2;
yield 3;
}
const generator = numberGenerator();
console.log(generator.next().value); // 输出:1
console.log(generator.next().value); // 输出:2
console.log(generator.next().value); // 输出:3
在上面的示例中,我们定义了一个生成器函数numberGenerator()
,它通过yield
关键字生成连续的数字。然后,我们创建了一个生成器对象generator
,并使用next()
方法逐步迭代生成器。每次调用next()
方法时,生成器函数将执行到下一个yield
语句,并返回该值。
示例2:生成器与循环
代码语言:javascript复制function* fibonacciGenerator() {
let a = 0;
let b = 1;
while (true) {
yield a;
[a, b] = [b, a b];
}
}
const fibonacci = fibonacciGenerator();
console.log(fibonacci.next().value); // 输出:0
console.log(fibonacci.next().value); // 输出:1
console.log(fibonacci.next().value); // 输出:1
console.log(fibonacci.next().value); // 输出:2
console.log(fibonacci.next().value); // 输出:3
// ...
在上面的示例中,我们定义了一个生成器函数fibonacciGenerator()
,它生成斐波那契数列的无限序列。通过使用yield
语句在每次迭代中产生新的斐波那契数,我们可以使用生成器对象fibonacci
来生成数列的值。
示例3:生成器作为迭代器
代码语言:javascript复制const myArray = ['apple', 'banana', 'orange'];
function* arrayIterator(arr) {
for (let i = 0; i < arr.length; i ) {
yield arr[i];
}
}
const iterator = arrayIterator(myArray);
console.log(iterator.next().value); // 输出:'apple'
console.log(iterator.next().value); // 输出:'banana'
console.log(iterator.next().value); // 输出:'orange'
在上面的示例中,我们定义了一个生成器函数arrayIterator()
,它接受一个数组作为参数,并使用yield
语句在每次迭代中生成数组的元素。通过创建生成器对象iterator
,我们可以像使用其他迭代器一样遍历数组的值。