小议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 得到文件后缀名的思路及实现
May 09 Javascript
jquery中checkbox全选失效的解决方法
Dec 26 Javascript
Redis基本知识、安装、部署、配置笔记
Mar 05 Javascript
jQuery中animate动画第二次点击事件没反应
May 07 Javascript
js实现网站最上边可关闭的浮动广告条代码
Sep 04 Javascript
FullCalendar日历插件应用之数据展现(一)
Dec 23 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
Apr 07 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
May 10 Javascript
Bootstrap CSS布局之图像
Dec 17 Javascript
鼠标点击input,显示瞬间的边框颜色,对之修改与隐藏实例
Dec 26 Javascript
用director.js实现前端路由使用实例
Jan 27 Javascript
详谈Object.defineProperty 及实现数据双向绑定
Jul 18 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
phpfans留言版用到的install.php
2007/01/04 PHP
php读取xml实例代码
2010/01/28 PHP
php木马webshell扫描器代码
2012/01/25 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
2015/10/16 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
2015/12/23 PHP
PHP实现动态添加XML中数据的方法
2018/03/30 PHP
PHP绕过open_basedir限制操作文件的方法
2018/06/10 PHP
Jquery 基础学习笔记
2009/05/29 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
2014/09/10 Javascript
Javscript调用iframe框架页面中函数的方法
2014/11/01 Javascript
不到30行JS代码实现Excel表格的方法
2014/11/15 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
2017/03/03 Javascript
解决BootStrap Fileinput手机图片上传显示旋转问题
2017/06/01 Javascript
使用webpack搭建react开发环境的方法
2018/05/15 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
基于jQuery实现可编辑的表格
2019/12/11 jQuery
vue-cli3单页构建大型项目方案
2020/04/07 Javascript
利用webpack理解CommonJS和ES Modules的差异区别
2020/06/16 Javascript
JS访问对象两种方式区别解析
2020/08/29 Javascript
[04:45]DOTA2上海特级锦标赛主赛事第四日RECAP
2016/03/06 DOTA
从零学python系列之教你如何根据图片生成字符画
2014/05/23 Python
Python数据库的连接实现方法与注意事项
2016/02/27 Python
使用Python实现简单的服务器功能
2017/08/25 Python
tornado+celery的简单使用详解
2019/12/21 Python
IronPython连接MySQL的方法步骤
2019/12/27 Python
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
2020/08/28 Python
荣耀商城:HIHONOR
2020/11/03 全球购物
医药大学生求职简历的自我评价
2013/10/17 职场文书
求职简历自荐信
2013/10/20 职场文书
服务承诺书
2015/01/19 职场文书
2016党校学习心得体会
2016/01/07 职场文书
《认识钟表》教学反思
2016/02/16 职场文书
有趣的二维码:使用MyQR和qrcode来制作二维码
2021/05/10 Python
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis
Flink 侧流输出源码示例解析
2022/09/23 Servers