JavaScript生成器如何使用
JavaScript生成器如何使用
这篇文章主要讲解了“JavaScript生成器如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript生成器如何使用”吧!
1. 什么是生成器 ?
可以理解成一个函数的内部状态的遍历器,每调用一次生成器,函数的内部状态发生一次改变。
2. 写法
function与函数名之间有一个星号*函数体内部可以使用
yield表达式,定义不同的状态
3. 生成器是怎么是实现的?
在生成器里面有着
next方法,遍历下一个状态yield表达式:相当于暂停标志,只有调用next方法才会遍历下一个内部状态使用
next方法时,从函数一开始或上一次停下来的地方开始执行,直到遇到下一个yield表达式 (或return语句) 为止
(即生成器函数就相当于是一种可以暂停执行的函数,yield表达式就是暂停标志)
让我们来通过个例子理解一下:
(举个我们熟悉的 Hello World!!!)
function*sayHW(){yield"Hello";yield"World";return"!!!";}letsay=sayHW();console.log(say.next());console.log(say.next());console.log(say.next());
这里一共调用了三次 next 方法:
第一次调用时,遇到 yield 停下来,next 方法返回一个对象,它的 value 属性就是当前 yield 表达式的值 Hello,done 属性的值是false,表示遍历未结束
第二次调用时,遇到 yield 停下来,next 方法返回一个对象,它的 value 属性就是当前 yield 表达式的值 World,done 属性的值是false,表示遍历未结束
然后直到第三次调用,执行到 return 语句(如果没有,就执行到函数结束)。这个时候,next 返回的 value 属性的值为 return 语句后面的值, done 的属性为 true (如果没有 return,这个时候 done 还是 false),表示循环结束。
接下来,我们再输出一次 next:
console.log(say.next());
这个时候 next 将会返回这个对象,value 为 undefined,done 为· true(不管之前有没有 return 语句,这时函数已经运行完毕了,所以 done 都为 true)
4. 利用生成器函数来自定义迭代器
通过上文讲述,我们可以知道生成器函数允许我们定义一个包含自有迭代算法的函数, 同时它可以自动维护自己的状态。
由于自定义迭代器需要显示地维护其内部状态,因此我们可以用它来自定义迭代器。
(如果对迭代器不了解的可以先看看这篇文章:JavaScript迭代器)
接下来,让我们来通过一个例子理解一下:
现在有一个 colors 对象,我们想用 for...of 对其遍历,那么就可以自定义迭代器。
letcolors={blue:"蓝色",green:"绿色",yellow:"黄色"}
普通写法:
colors[Symbol.iterator]=function(){letkeys=Object.keys(colors);//如果用letkeys=Reflect.ownKeys(colors),keys就会包括一些不可枚举的属性//那么后面的len要减一,减去Symbol.iterator这个属性//根据实际情况选择使用letlen=keys.length;letindex=0;return{next:function(){if(index 用生成器函数写法: colors[Symbol.iterator]=function*(){letkeys=Object.keys(colors);//如果用letkeys=Reflect.ownKeys(colors),包括了一些不可枚举的属性//那么后面的len要减一,减去Symbol.iterator这个属性//根据实际情况选择使用letlen=keys.length;letindex=0;while(index 感谢各位的阅读,以上就是“JavaScript生成器如何使用”的内容了,经过本文的学习后,相信大家对JavaScript生成器如何使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是恰卡编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!
推荐阅读
-
Node.js N-API 开发:C++ 扩展与 JavaScript 高性能交互
-
WebStorm 与 VS Code 对比:JavaScript 开发该如何选择 IDE?
-
WebStorm 与 VS Code 对比:JavaScript 开发工具选型分析
-
JavaScript闭包用多会造成内存泄露吗
JavaScript闭包用多会造成内存泄露吗今天小编给大家分享一下...
-
javascript中文乱码如何解决
javascript中文乱码如何解决本篇内容介绍了“javascr...
-
PHP学习第十五天——JavaScript入门DOM对象:二
-
Node.js基本内容和知识点
简单的说node.js就是运行在服务端的JavaScript,起初段定位是后端开发语言,由于技术的不够成熟,一般小型项目...
-
PHP与Node.js:一个史诗般开发者的分享
-
JavaScript 中 find() 和 filter() 方法的区别
JavaScript在ES6上有很多数组方法,每种方法都有独特的用途和好处。在开发应用程序时,大多使用数组方法来获...
-
js怎么跟php结合使用
