小议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 相关文章推荐
javascript 面向对象编程 万物皆对象
Sep 17 Javascript
JS 动态获取节点代码innerHTML分析 [IE,FF]
Nov 30 Javascript
js获取当前页面的url网址信息
Jun 12 Javascript
jquery滚动到顶部底部代码
Apr 20 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
Aug 27 Javascript
JS实现网页标题栏显示当前时间和日期的完整代码
Nov 02 Javascript
jQuery获取file控件中图片的宽高与大小
Aug 04 Javascript
jQuery Ajax传值到Servlet出现乱码问题的解决方法
Oct 09 Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
Jan 22 Javascript
Vue form表单动态添加组件实战案例
Sep 02 Javascript
element中table高度自适应的实现
Oct 21 Javascript
详解Vue中的watch和computed
Nov 09 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 at(@)符号的用法简介
2009/07/11 PHP
解析php中array_merge与array+array的区别
2013/06/21 PHP
php删除数组元素示例分享
2014/02/17 PHP
PHP写的资源下载防盗链类分享
2014/05/12 PHP
浅谈php的TS和NTS的区别
2019/03/13 PHP
javascript 最常用的10个自定义函数[推荐]
2009/12/26 Javascript
IE6下出现JavaScript未结束的字符串常量错误的解决方法
2010/11/21 Javascript
JS 获取鼠标左右键的键值方法
2014/10/11 Javascript
js实现滑动触屏事件监听的方法
2015/05/05 Javascript
javascript实现框架高度随内容改变的方法
2015/07/23 Javascript
jquery+php随机生成红包金额数量代码分享
2015/08/27 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
2016/06/26 Javascript
Vue.js每天必学之构造器与生命周期
2016/09/05 Javascript
jQuery命名空间与闭包用法示例
2017/01/12 Javascript
深入了解javascript 数组的sort方法
2018/06/01 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
JS函数节流和防抖之间的区分和实现详解
2019/01/11 Javascript
layui实现图片虚拟路径上传,预览和删除的例子
2019/09/25 Javascript
JavaScript Dom实现轮播图原理和实例
2021/02/19 Javascript
qpython3 读取安卓lastpass Cookies
2016/06/19 Python
python中matplotlib实现最小二乘法拟合的过程详解
2017/07/11 Python
Python+OpenCV让电脑帮你玩微信跳一跳
2018/01/04 Python
如何使用VSCode愉快的写Python于调试配置步骤
2018/04/06 Python
基于Python 装饰器装饰类中的方法实例
2018/04/21 Python
对PyQt5中树结构的实现方法详解
2019/06/17 Python
Django模板获取field的verbose_name实例
2020/05/19 Python
台湾饭店和机票预订网站:Expedia台湾
2016/08/05 全球购物
KIKO比利时官网:意大利彩妆品牌
2017/07/23 全球购物
波兰灯具、照明和LED购物网站:Lampy.pl
2019/03/11 全球购物
电子商务专业学生的自我鉴定
2013/11/28 职场文书
2014五年级班主任工作总结
2014/12/05 职场文书
幼儿园教师求职信
2015/03/20 职场文书
陪护人员误工证明
2015/06/24 职场文书
2015年环境监察工作总结
2015/07/23 职场文书
详解JavaScript中Arguments对象用途
2021/08/30 Javascript
如何利用golang运用mysql数据库
2022/03/13 Golang