小议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 编程引入命名空间的方法
Jun 29 Javascript
转换字符串为json对象的方法详解
Nov 29 Javascript
javascript模拟map输出与去除重复项的方法
Feb 09 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
Nov 30 Javascript
JS组件中bootstrap multiselect两大组件较量
Jan 26 Javascript
微信小程序中button组件的边框设置的实例详解
Sep 27 Javascript
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
May 26 Javascript
vue项目部署到Apache服务器中遇到的问题解决
Aug 24 Javascript
vue实现移动端图片上传功能
Dec 23 Javascript
es6函数之严格模式用法实例分析
Mar 17 Javascript
使用 Opentype.js 生成字体子集的实例代码详解
May 25 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
Oct 24 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使用DOMDocument类生成HTML实例(包含常见标签元素)
2014/06/25 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
2018/01/15 PHP
从数据结构的角度分析 for each in 比 for in 快的多
2013/07/07 Javascript
解析Javascript中中括号“[]”的多义性
2013/12/03 Javascript
javascript中使用正则计算中文长度的例子
2014/04/29 Javascript
wap图片滚动特效无css3元素纯js脚本编写
2014/08/22 Javascript
在JavaScript的正则表达式中使用exec()方法
2015/06/16 Javascript
JavaScript获取IP获取的是IPV6 如何校验
2016/06/12 Javascript
JS控制文本域只读或可写属性的方法
2016/06/24 Javascript
jquery 属性选择器(匹配具有指定属性的元素)
2016/09/06 Javascript
学习vue.js计算属性
2016/12/03 Javascript
jQuery异步提交表单实例
2017/05/30 jQuery
在vue项目中使用codemirror插件实现代码编辑器功能
2019/08/27 Javascript
解决layer图标icon不加载的问题
2019/09/04 Javascript
JavaScript常用8种数组去重代码实例
2020/09/09 Javascript
Ant Design的可编辑Tree的实现操作
2020/10/31 Javascript
Vue组件简易模拟实现购物车
2020/12/21 Vue.js
梳理一下vue中的生命周期
2020/12/30 Vue.js
[03:09]显微镜下的DOTA2第一期——带你走进华丽的DOTA2世界
2014/06/20 DOTA
使用Python下载Bing图片(代码)
2013/11/07 Python
Python调用C/C++动态链接库的方法详解
2014/07/22 Python
用Python编写分析Python程序性能的工具的教程
2015/04/01 Python
python中的decorator的作用详解
2018/07/26 Python
python实现维吉尼亚加密法
2019/03/20 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
2020/06/03 Python
Python 打印自己设计的字体的实例讲解
2021/01/04 Python
荷兰电脑专场:Paradigit
2018/05/05 全球购物
中东奢侈品市场:Coveti
2019/05/12 全球购物
老师自我鉴定范文
2013/12/25 职场文书
2014年清明节网上祭英烈寄语
2014/04/09 职场文书
公司捐款倡议书
2014/05/14 职场文书
军人离婚协议书样本
2014/10/21 职场文书
党员四风问题个人对照检查材料
2014/10/26 职场文书
2014年安全保卫工作总结
2014/11/13 职场文书
校园开放日新闻稿
2015/07/17 职场文书
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
2021/05/12 Python