小议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 相关文章推荐
JsEasy简介 JsEasy是什么?与下载
Mar 07 Javascript
最短的javascript:地址栏载入脚本代码
Oct 13 Javascript
jquery禁止回车触发表单提交
Dec 12 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
Apr 28 Javascript
JavaScript每天定时更换皮肤样式的方法
Jul 01 Javascript
js正则表达式中exec用法实例
Jul 23 Javascript
JavaScript数据结构与算法之集合(Set)
Jan 29 Javascript
js中 计算两个日期间的工作日的简单实例
Aug 08 Javascript
分分钟玩转Vue.js组件
Oct 25 Javascript
jQuery中的100个技巧汇总
Dec 15 Javascript
小程序指纹验证的实现代码
Dec 04 Javascript
Vue中 axios delete请求参数操作
Aug 25 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实现的简易版图片相似度比较
2015/01/07 PHP
jquery获取input表单值的代码
2010/04/19 Javascript
js定时器(执行一次、重复执行)
2014/03/07 Javascript
原生js实现复制对象、扩展对象 类似jquery中的extend()方法
2014/08/30 Javascript
js继承call()和apply()方法总结
2014/12/08 Javascript
简介JavaScript中的setHours()方法的使用
2015/06/11 Javascript
javascript实现五星评价代码(源码下载)
2015/08/11 Javascript
JS+CSS实现带小三角指引的滑动门效果
2015/09/22 Javascript
textarea 在浏览器中固定大小和禁止拖动的实现方法
2016/12/03 Javascript
JavaScript获取URL参数的方法之一
2017/03/24 Javascript
详解swiper在vue中的应用(以3.0为例)
2018/09/20 Javascript
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
微信小程序实现多选框功能的实例代码
2020/06/24 Javascript
[01:53]3.19 DOTA2发布会 现场精彩Coser表演
2014/03/25 DOTA
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
2015/04/01 Python
Python实现查找系统盘中需要找的字符
2015/07/14 Python
python相似模块用例
2016/03/04 Python
python实现汉诺塔递归算法经典案例
2021/03/01 Python
python非递归全排列实现方法
2017/04/10 Python
python 获取文件下所有文件或目录os.walk()的实例
2018/04/23 Python
在pycharm中python切换解释器失败的解决方法
2018/10/29 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
2019/04/09 Python
Python可变对象与不可变对象原理解析
2020/02/25 Python
Python调用JavaScript代码的方法
2020/10/27 Python
python 写一个文件分发小程序
2020/12/05 Python
Python扫描端口的实现
2021/01/25 Python
详解canvas在圆弧周围绘制文本的两种写法
2018/05/22 HTML / CSS
详解canvas绘制多张图的排列顺序问题
2019/01/21 HTML / CSS
中国海淘族值得信赖的海淘返利网站:55海淘
2017/01/16 全球购物
三个Unix的命令面试题
2015/04/12 面试题
《纸船和风筝》教学反思
2014/02/15 职场文书
校园文化标语
2014/06/18 职场文书
电话客服专员岗位职责
2014/06/28 职场文书
2019年图书室自查报告范本
2019/10/12 职场文书
python 如何用terminal输入参数
2021/05/25 Python
Python绘制散乱的点构成的图的方法
2022/04/21 Python