小议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 遍历验证所有文本框的值
Aug 27 Javascript
JS对select控件option选项的增删改查示例代码
Oct 21 Javascript
node.js中的buffer.toJSON方法使用说明
Dec 14 Javascript
jQuery实现鼠标划过添加和删除class的方法
Jun 26 Javascript
JavaScript检测字符串中是否含有html标签实现方法
Jul 01 Javascript
jquery设置css样式的多种方法(总结)
Feb 21 Javascript
利用NPM淘宝的node.js镜像加速nvm
Mar 27 Javascript
js+html5生成自动排列对话框实例
Oct 09 Javascript
node中的cookie的具体使用
Sep 13 Javascript
es6数值的扩展方法
Mar 11 Javascript
微信小程序实现消息框弹出动画
Apr 18 Javascript
快速解决element的autofocus失效问题
Sep 08 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 快速生成 Flash 动画的方法
2007/03/06 PHP
关于session在PHP5的配置文件中的详细设置参数说明
2011/04/20 PHP
解析php下载远程图片函数 可伪造来路
2013/06/25 PHP
PHP微框架Dispatch简介
2014/06/12 PHP
PHP反向代理类代码
2014/08/15 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
WordPress中&quot;无法将上传的文件移动至&quot;错误的解决方法
2015/07/01 PHP
php如何实现只替换一次或N次
2015/10/29 PHP
php如何获取Http请求
2020/04/30 PHP
js 函数调用模式小结
2011/12/26 Javascript
通过js动态操作table(新增,删除相关列信息)
2012/05/23 Javascript
打豆豆小游戏 用javascript编写的[打豆豆]小游戏
2013/01/08 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
Vue概念及常见命令介绍(1)
2016/12/08 Javascript
Vue.js开发环境快速搭建教程
2017/03/17 Javascript
vue 中使用print.js导出pdf操作
2020/11/13 Javascript
python的常见命令注入威胁
2013/02/18 Python
Python实现简单的语音识别系统
2017/12/13 Python
python中不能连接超时的问题及解决方法
2018/06/10 Python
python  Django中的apps.py的目的是什么
2018/10/15 Python
python 输出所有大小写字母的方法
2019/01/02 Python
pytorch自定义二值化网络层方式
2020/01/07 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
2013/01/09 HTML / CSS
蔻驰法国官网:COACH法国
2018/11/14 全球购物
全球性的女装店:storets
2019/06/12 全球购物
瑞士首家网上药店折扣店:McDrogerie
2020/12/22 全球购物
大三在校生电子商务求职信
2013/10/29 职场文书
银行类自荐信
2014/02/04 职场文书
体育教师求职信
2014/06/30 职场文书
2014年新农村建设工作总结
2014/12/01 职场文书
教师个人发展总结
2015/02/11 职场文书
2015年教研工作总结
2015/05/23 职场文书
Spring mvc是如何实现与数据库的前后端的连接操作的?
2021/06/30 Java/Android
2021年国产动漫公司排行前十名,玄机科技上榜,第二推出过铠甲勇士
2022/03/18 杂记
mysql 乱码 字符集latin1转UTF8
2022/04/19 MySQL