小议JavaScript中Generator和Iterator的使用


Posted in Javascript onJuly 29, 2015

一说到 Generator,大家就会扯上异步之类是话题。这显然是被一些奇奇怪怪的东西带坏了。与 Generator 关系密切的应该是 Iterator 才对,拿 Generator 来处理异步也许是一些 C# 程序员才会想的事。当然这种用法确实有一套完整的东西,只是我个人不喜欢而已。

非要把 Generator 和异步联系上,唯一的点就是 next 的调用时机。因为 next 可以异步地调用,所以 Generator 才得以被异步地滥用。

但我觉得 next 这个方法虽然可以异步调用,但正确的使用方式应该是同步的。至少当一个 Generator 实例被用于 for-of 循环或 [...obj] 解构时都是连续调用 next 的。

除了 next 的同异步问题外,next 的参数也是个问题。由于 next 调用时传入的参数会被作为 yield 运算符的返回值,所以 generator 有了更丰富的使用方式。在早期的 python 中 yield 是语句而不是运算符,所以也不存在这样的用法。后来的版本才把 yield 作为运算符,所以才出现了各种坑。

把 Generator 实例作为 Iterator 时既不会异步调用 next,也不会给 next 传入参数。我觉得这才是 Generator 的正确用法。或者说白了,Generator 就是用来实现 Iterator 的。至少 Generator 这个名字没有别的含义了。下面是一个用法示例:
运行

<script>
var match = function * (pattern, string) {
 var regexp = new RegExp(pattern, 'g'); 
 for(let i; i = regexp.exec(string); yield i);
};

for(let i of match('a', 'abcabcabc')) {
 console.log(i);
}
</script>
Javascript 相关文章推荐
基于jquery的表头固定的若干方法
Jan 27 Javascript
通过复制Table生成word和excel的javascript代码
Jan 20 Javascript
jQuery中的height innerHeight outerHeight区别示例介绍
Jun 15 Javascript
JavaScript自定义数组排序方法
Feb 12 Javascript
js方法数据验证的简单实例
Sep 17 Javascript
jQuery实现腾讯信用界面(自制刻度尺)样式
Aug 15 jQuery
three.js中文文档学习之创建场景
Nov 20 Javascript
微信小程序实现下拉刷新和轮播图效果
Nov 21 Javascript
微信小程序之判断页面滚动方向的示例代码
Aug 30 Javascript
javascript设计模式 ? 模板方法模式原理与用法实例分析
Apr 23 Javascript
如何在Vue.JS中使用图标组件
Aug 04 Javascript
JavaScript实现H5接金币功能(实例代码)
Feb 22 Javascript
浅析Node.js的Stream模块中的Readable对象
Jul 29 #Javascript
浅谈Javascript数组的使用
Jul 29 #Javascript
举例讲解Node.js中的Writable对象
Jul 29 #Javascript
浅谈Javascript数组索引
Jul 29 #Javascript
JQ实现新浪游戏首页幻灯片
Jul 29 #Javascript
JavaScript中几种排序算法的简单实现
Jul 29 #Javascript
详解JavaScript中数组的相关知识
Jul 29 #Javascript
You might like
PHP仿盗链代码
2012/06/03 PHP
PHP对象相关知识总结
2017/04/09 PHP
PHP中PDO事务处理操作示例
2018/05/02 PHP
使用apply方法实现javascript中的对象继承
2013/12/16 Javascript
Jquery中ajax方法data参数的用法小结
2014/02/12 Javascript
jQuery中index()方法用法实例
2014/12/27 Javascript
js实现表单Radio切换效果的方法
2015/08/17 Javascript
JS实现网页右侧带动画效果的伸缩窗口代码
2015/10/29 Javascript
基于 Bootstrap Datetimepicker 联动
2017/08/03 Javascript
Vue实现简单分页器
2018/12/29 Javascript
JavaScript实现简单进度条效果
2020/03/25 Javascript
Vue.js中使用Vuex实现组件数据共享案例
2020/07/31 Javascript
js异步接口并发数量控制的方法示例
2020/11/22 Javascript
Nest.js散列与加密实例详解
2021/02/24 Javascript
[00:31]DOTA2上海特级锦标赛 Fnatic战队宣传片
2016/03/04 DOTA
[01:28:44]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第一场 1月10日
2021/03/11 DOTA
python里将list中元素依次向前移动一位
2014/09/12 Python
Python3 max()函数基础用法
2019/02/19 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
2020/01/08 Python
Python基础之字符串常见操作经典实例详解
2020/02/26 Python
HTML5-WebSocket实现聊天室示例
2016/12/15 HTML / CSS
维氏瑞士军刀英国网站:Victorinox英国
2019/07/04 全球购物
Kendra Scott官网:美国领先的时尚配饰品牌
2020/10/22 全球购物
中专生自荐信
2013/10/12 职场文书
新闻系毕业生推荐信
2013/11/16 职场文书
办公室综合文员岗位职责范本
2014/02/13 职场文书
反邪教标语
2014/06/23 职场文书
开展党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
档案管理员岗位职责
2015/02/12 职场文书
2015年老干部工作总结
2015/04/23 职场文书
2015年纪念“卢沟桥事变”78周年活动方案
2015/05/06 职场文书
小学校长开学致辞
2015/07/29 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书
解决redis批量删除key值的问题
2022/03/23 Redis
5人制售《绝地求生》游戏外挂获利500多万元 被判刑
2022/03/31 其他游戏
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/07 PostgreSQL