📜  解释 JavaScript 中不同类型的生成器

📅  最后修改于: 2022-05-13 01:56:14.769000             🧑  作者: Mango

解释 JavaScript 中不同类型的生成器

生成器是可以根据程序员的要求暂停和恢复执行的函数。我们在这个函数中使用 yield 关键字来停止代码的执行。生成器在异步编程中非常有用。生成器与编程语言的不同特性相结合,使其自身对程序员有用,以便使用它进行有效的编程。

可以使用生成器函数表达式和生成器函数构造函数来创建生成器:

函数表达式:

function* FUNCTION_NAME( argu1[, argu2[,...argu3]]]) { 
    // Generator body
}

生成器函数构造函数:

var generator_constructor = 
    Object.getPrototypeOf( function*(){} ).constructor
    
var FUNCTION_NAME = generator_constructor()

因为生成器非常有用。让我们来谈谈 javascript 中不同类型的生成器:

普通生成器:它是一种生成器,其中像迭代器这样的生成器在对生成器函数执行每个 next() 方法后生成下一个值。在这种情况下,我们将以连续的方式产生数字,直到最后一个 yield 关键字。

Javascript
function* generator(){
    for(var i = 0 ; i<5; i++){
        yield i;
    }
}
  
var first_gen = generator();
  
console.log(first_gen.next().value);
console.log(first_gen.next().value);
console.log(first_gen.next().value);
console.log(first_gen.next().value);
console.log(first_gen.next().value);


Javascript
function* generator(){
    para1 = yield ;
    console.log(para1);
    para2 = yield ;
    console.log(para2)   
}
  
var first_gen = generator();
first_gen.next("this is not going to assing any one");
first_gen.next("I am first");
first_gen.next("I am second")


Javascript
var temp = {
    *generator(){
        yield "1 yield";
        yield "2 yield";
    }
}
  
var gen = temp.generator();
  
console.log(gen.next().value);
console.log(gen.next().value);


Javascript
function* generator1(){
    yield "this is first Generator";
}
  
function* generator2(){
    yield* generator1();
    yield "this is second Generator";
}
  
var gen = generator2();
  
console.log(gen.next().value);
console.log(gen.next().value);


Javascript
function* Return_generator(){
    yield "First";
    return "Second";
    yield "Infinit";
}
  
var gen = Return_generator();
  
console.log(gen.next().value);
console.log(gen.next().value);


Javascript
class temp{
*generator(){
    yield "Generator with object method ";
    yield "Second flow of Generator";
}
}
var temp2 = new temp()
var gen = temp2.generator();
  
console.log(gen.next().value);
console.log(gen.next().value);


输出:

0
1
2
3
4

带参数的生成器:在此生成器中,我们将参数传递给生成器的 next 方法,并将此参数替换为在暂停函数执行之前的最后一个 yield 关键字。这里生成器函数参数的第一个 next 方法不会替换为任何 yield 关键字,因为在函数的第一次暂停之前没有 yield 关键字。以同样的方式 seconds ,调用 next 方法的参数被替换为第一个 yield 关键字,第三个 next 方法参数被替换为第二个 yield 关键字。

Javascript

function* generator(){
    para1 = yield ;
    console.log(para1);
    para2 = yield ;
    console.log(para2)   
}
  
var first_gen = generator();
first_gen.next("this is not going to assing any one");
first_gen.next("I am first");
first_gen.next("I am second")

输出:

I am first
I am second

具有对象属性的生成器:在这种生成器中,生成器被定义为对象的属性。我们可以创建一个生成器实例,然后执行下一个方法以进一步执行生成器。在这种情况下,生成器与普通生成器一样,但它是对象的属性。

Javascript

var temp = {
    *generator(){
        yield "1 yield";
        yield "2 yield";
    }
}
  
var gen = temp.generator();
  
console.log(gen.next().value);
console.log(gen.next().value);

输出:

1 yield
2 yield

带有另一个生成器的生成器:在这种生成器中,我们有一个生成器,其中包含一个 Yield,其函数体内还有另一个生成器。当执行遇到另一个生成器的 yield 时,它会完成该生成器的执行,然后继续使用主生成器。

Javascript

function* generator1(){
    yield "this is first Generator";
}
  
function* generator2(){
    yield* generator1();
    yield "this is second Generator";
}
  
var gen = generator2();
  
console.log(gen.next().value);
console.log(gen.next().value);

输出:

this is first Generator
this is second Generator

带有返回关键字的生成器:在这种生成器中,函数Body 包含一个返回关键字。在这里,当生成器函数遇到 return 关键字时,它会停止并退出函数的执行并返回值生成器对象。 return 关键字之后将永远不会在我们的程序执行中被执行。

Javascript

function* Return_generator(){
    yield "First";
    return "Second";
    yield "Infinit";
}
  
var gen = Return_generator();
  
console.log(gen.next().value);
console.log(gen.next().value);

输出:

First
Second

生成器创建为对象方法:我们可以将生成器创建为对象的方法,并可以根据需要使用它们。在这种情况下,当我们为对象创建一个普通函数时,我们创建了对象的生成器函数。我们可以将 Generator函数与 Object 的实例一起使用。在这种情况下,Generator 可用作 Object 的方法。

Javascript

class temp{
*generator(){
    yield "Generator with object method ";
    yield "Second flow of Generator";
}
}
var temp2 = new temp()
var gen = temp2.generator();
  
console.log(gen.next().value);
console.log(gen.next().value);

输出:

Generator with object method 
Second flow of Generator