如何用十分钟快速掌握JavaScript生成器的概念?

2026-03-31 14:321阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1601个文字,预计阅读时间需要7分钟。

如何用十分钟快速掌握JavaScript生成器的概念?

本章节为家长带来JavaScript生成器的基础知识,包括生成器的实现原理以及如何利用生成器函数自定义迭代器。希望对家长有所帮助。

1. 什么是生成器?生成器是一种特殊的函数,可以暂停和恢复执行,并在每次暂停时返回一个值。它可以理解为函数内部的内部状态遍历器。

2. 生成器是如何实现的?生成器通过yield关键字实现暂停和恢复执行。每次调用生成器函数时,它会返回一个生成器对象,该对象具有next()方法,用于启动或恢复生成器的执行。

3. 生成器的用途和优势生成器函数可以自定义迭代器,使得遍历数据结构(如数组、对象、字符串等)更加灵活和高效。以下是生成器的一些用途和优势:

- 遍历大型数据集,避免内存溢出- 处理异步操作,如读取文件、网络请求等- 实现复杂的迭代逻辑,如斐波那契数列、生成器模式等

4. 生成器函数自定义迭代器生成器函数可以自定义迭代器,通过yield关键字返回值,并在函数体内维护状态。以下是一个示例:

javascriptfunction* generatorFunc() { let i=0; while (i <5) { yield i++; }}

const gen=generatorFunc();console.log(gen.next().value); // 0console.log(gen.next().value); // 1console.log(gen.next().value); // 2console.log(gen.next().value); // 3console.log(gen.next().value); // 4

在这个示例中,生成器函数`generatorFunc`通过yield关键字返回0到4的值,并在每次调用next()时恢复执行。

本篇文章给大家带来JavaScript生成器、生成器是怎么实现的和利用生成器函数自定义迭代器的相关知识,希望对大家有帮助。

1. 什么是生成器 ?

可以理解成一个函数的内部状态的遍历器,每调用一次生成器,函数的内部状态发生一次改变。


2. 写法
  • function 与函数名之间有一个星号 *
  • 函数体内部可以使用 yield 表达式,定义不同的状态

3. 生成器是怎么是实现的?
  • 在生成器里面有着 next 方法,遍历下一个状态
  • yield 表达式:相当于暂停标志,只有调用 next 方法才会遍历下一个内部状态
  • 使用 next 方法时,从函数一开始或上一次停下来的地方开始执行,直到遇到下一个 yield 表达式 (或 return 语句) 为止
    (即生成器函数就相当于是一种可以暂停执行的函数,yield 表达式就是暂停标志)

让我们来通过个例子理解一下:
(举个我们熟悉的 Hello World!!!)

function* sayHW(){ yield "Hello"; yield "World"; return "!!!";}let say = sayHW();console.log(say.next());console.log(say.next());console.log(say.next());

这里一共调用了三次 next 方法:

第一次调用时,遇到 yield 停下来,next 方法返回一个对象,它的 value 属性就是当前 yield 表达式的值 Hellodone 属性的值是false,表示遍历未结束

第二次调用时,遇到 yield 停下来,next 方法返回一个对象,它的 value 属性就是当前 yield 表达式的值 Worlddone 属性的值是false,表示遍历未结束

然后直到第三次调用,执行到 return 语句(如果没有,就执行到函数结束)。这个时候,next 返回的 value 属性的值为 return 语句后面的值, done 的属性为 true (如果没有 return,这个时候 done 还是 false),表示循环结束。

接下来,我们再输出一次 next

console.log(say.next());


这个时候 next 将会返回这个对象,valueundefineddone 为· true(不管之前有没有 return 语句,这时函数已经运行完毕了,所以 done 都为 true


4. 利用生成器函数来自定义迭代器

通过上文讲述,我们可以知道生成器函数允许我们定义一个包含自有迭代算法的函数, 同时它可以自动维护自己的状态。

由于自定义迭代器需要显示地维护其内部状态,因此我们可以用它来自定义迭代器。
(如果对迭代器不了解的可以先看看这篇文章:JavaScript迭代器)

如何用十分钟快速掌握JavaScript生成器的概念?

接下来,让我们来通过一个例子理解一下:

现在有一个 colors 对象,我们想用 for...of 对其遍历,那么就可以自定义迭代器。

let colors = { blue : "蓝色", green : "绿色", yellow : "黄色"}

普通写法:

colors[Symbol.iterator] = function() { let keys = Object.keys(colors); // 如果用 let keys = Reflect.ownKeys(colors),keys 就会包括一些不可枚举的属性 // 那么后面的 len 要减一,减去Symbol.iterator这个属性 // 根据实际情况选择使用 let len = keys.length; let index = 0; return { next : function() { if (index < len) { return { value : colors[keys[index++]], done : false } } return { done : true } } }}

用生成器函数写法:

colors[Symbol.iterator] = function* () { let keys = Object.keys(colors); // 如果用 let keys = Reflect.ownKeys(colors),包括了一些不可枚举的属性 // 那么后面的 len 要减一,减去Symbol.iterator这个属性 // 根据实际情况选择使用 let len = keys.length; let index = 0; while(index < len) { yield colors[keys[index++]]; }}

这样就完成啦,用了生成器函数来自定义迭代器之后是不是简洁了许多。

本文共计1601个文字,预计阅读时间需要7分钟。

如何用十分钟快速掌握JavaScript生成器的概念?

本章节为家长带来JavaScript生成器的基础知识,包括生成器的实现原理以及如何利用生成器函数自定义迭代器。希望对家长有所帮助。

1. 什么是生成器?生成器是一种特殊的函数,可以暂停和恢复执行,并在每次暂停时返回一个值。它可以理解为函数内部的内部状态遍历器。

2. 生成器是如何实现的?生成器通过yield关键字实现暂停和恢复执行。每次调用生成器函数时,它会返回一个生成器对象,该对象具有next()方法,用于启动或恢复生成器的执行。

3. 生成器的用途和优势生成器函数可以自定义迭代器,使得遍历数据结构(如数组、对象、字符串等)更加灵活和高效。以下是生成器的一些用途和优势:

- 遍历大型数据集,避免内存溢出- 处理异步操作,如读取文件、网络请求等- 实现复杂的迭代逻辑,如斐波那契数列、生成器模式等

4. 生成器函数自定义迭代器生成器函数可以自定义迭代器,通过yield关键字返回值,并在函数体内维护状态。以下是一个示例:

javascriptfunction* generatorFunc() { let i=0; while (i <5) { yield i++; }}

const gen=generatorFunc();console.log(gen.next().value); // 0console.log(gen.next().value); // 1console.log(gen.next().value); // 2console.log(gen.next().value); // 3console.log(gen.next().value); // 4

在这个示例中,生成器函数`generatorFunc`通过yield关键字返回0到4的值,并在每次调用next()时恢复执行。

本篇文章给大家带来JavaScript生成器、生成器是怎么实现的和利用生成器函数自定义迭代器的相关知识,希望对大家有帮助。

1. 什么是生成器 ?

可以理解成一个函数的内部状态的遍历器,每调用一次生成器,函数的内部状态发生一次改变。


2. 写法
  • function 与函数名之间有一个星号 *
  • 函数体内部可以使用 yield 表达式,定义不同的状态

3. 生成器是怎么是实现的?
  • 在生成器里面有着 next 方法,遍历下一个状态
  • yield 表达式:相当于暂停标志,只有调用 next 方法才会遍历下一个内部状态
  • 使用 next 方法时,从函数一开始或上一次停下来的地方开始执行,直到遇到下一个 yield 表达式 (或 return 语句) 为止
    (即生成器函数就相当于是一种可以暂停执行的函数,yield 表达式就是暂停标志)

让我们来通过个例子理解一下:
(举个我们熟悉的 Hello World!!!)

function* sayHW(){ yield "Hello"; yield "World"; return "!!!";}let say = sayHW();console.log(say.next());console.log(say.next());console.log(say.next());

这里一共调用了三次 next 方法:

第一次调用时,遇到 yield 停下来,next 方法返回一个对象,它的 value 属性就是当前 yield 表达式的值 Hellodone 属性的值是false,表示遍历未结束

第二次调用时,遇到 yield 停下来,next 方法返回一个对象,它的 value 属性就是当前 yield 表达式的值 Worlddone 属性的值是false,表示遍历未结束

然后直到第三次调用,执行到 return 语句(如果没有,就执行到函数结束)。这个时候,next 返回的 value 属性的值为 return 语句后面的值, done 的属性为 true (如果没有 return,这个时候 done 还是 false),表示循环结束。

接下来,我们再输出一次 next

console.log(say.next());


这个时候 next 将会返回这个对象,valueundefineddone 为· true(不管之前有没有 return 语句,这时函数已经运行完毕了,所以 done 都为 true


4. 利用生成器函数来自定义迭代器

通过上文讲述,我们可以知道生成器函数允许我们定义一个包含自有迭代算法的函数, 同时它可以自动维护自己的状态。

由于自定义迭代器需要显示地维护其内部状态,因此我们可以用它来自定义迭代器。
(如果对迭代器不了解的可以先看看这篇文章:JavaScript迭代器)

如何用十分钟快速掌握JavaScript生成器的概念?

接下来,让我们来通过一个例子理解一下:

现在有一个 colors 对象,我们想用 for...of 对其遍历,那么就可以自定义迭代器。

let colors = { blue : "蓝色", green : "绿色", yellow : "黄色"}

普通写法:

colors[Symbol.iterator] = function() { let keys = Object.keys(colors); // 如果用 let keys = Reflect.ownKeys(colors),keys 就会包括一些不可枚举的属性 // 那么后面的 len 要减一,减去Symbol.iterator这个属性 // 根据实际情况选择使用 let len = keys.length; let index = 0; return { next : function() { if (index < len) { return { value : colors[keys[index++]], done : false } } return { done : true } } }}

用生成器函数写法:

colors[Symbol.iterator] = function* () { let keys = Object.keys(colors); // 如果用 let keys = Reflect.ownKeys(colors),包括了一些不可枚举的属性 // 那么后面的 len 要减一,减去Symbol.iterator这个属性 // 根据实际情况选择使用 let len = keys.length; let index = 0; while(index < len) { yield colors[keys[index++]]; }}

这样就完成啦,用了生成器函数来自定义迭代器之后是不是简洁了许多。