小议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 实现简单的倒计时弹窗DEMO附图
Mar 05 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
Jun 19 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
Oct 15 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
Jun 10 Javascript
JS JSOP跨域请求实例详解
Jul 04 Javascript
easyUI combobox实现联动效果
Jan 17 Javascript
详解angularjs获取元素以及angular.element()用法
Jul 25 Javascript
通过JS深度判断两个对象字段相同
Jun 14 Javascript
如何使用JS console.log()技巧提高工作效率
Oct 14 Javascript
JS画布动态实现黑客帝国背景效果
Nov 08 Javascript
video.js添加自定义组件的方法
Dec 09 Javascript
如何使用CocosCreator对象池
Apr 14 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
openflashchart 2.0 简单案例php版
2012/05/21 PHP
解决phpmyadmin中缺少mysqli扩展问题的方法
2013/05/06 PHP
php获取textarea的值并处理回车换行的方法
2014/10/20 PHP
php.ini中的request_order推荐设置
2015/05/10 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
不间断滚动JS打包类,基本可以实现所有的滚动效果,太强了
2007/12/08 Javascript
如何使用Javascript正则表达式来格式化XML内容
2013/07/04 Javascript
JS获取随机数函数可自定义最小值最大值
2014/05/08 Javascript
jQuery获取与设置iframe高度的方法
2016/08/01 Javascript
js原生实现FastClick事件的实例
2016/11/20 Javascript
jQuery点击弹出层弹出模态框点击模态框消失代码分享
2017/01/21 Javascript
json2.js 入门教程之使用方法与实例分析
2017/09/14 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
2018/04/22 Javascript
vue中的自定义分页插件组件的示例
2018/08/18 Javascript
vue自定v-model实现表单数据双向绑定问题
2018/09/03 Javascript
vue实现分页栏效果
2019/06/28 Javascript
vue-dplayer 视频播放器实例代码
2019/11/08 Javascript
重置Redux的状态数据的方法实现
2019/11/18 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
2020/06/04 Javascript
用Python实现一个简单的线程池
2015/04/07 Python
python django 访问静态文件出现404或500错误
2017/01/20 Python
Python OpenCV 直方图的计算与显示的方法示例
2018/02/08 Python
python学习基础之循环import及import过程
2018/04/22 Python
Python实现将Excel转换成xml的方法示例
2018/08/25 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
2018/12/05 Python
Python3合并两个有序数组代码实例
2020/08/11 Python
新郎父亲婚宴答谢词
2014/01/11 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
档案管理员岗位职责
2015/02/12 职场文书
学生个人总结范文
2015/02/15 职场文书
2015年办公室文秘工作总结
2015/04/30 职场文书
2016大学军训通讯稿
2015/11/25 职场文书
如果用一句诗总结你的上半年,你会用哪句呢?
2019/07/16 职场文书
导游词之西递宏村
2019/12/10 职场文书
Pygame如何使用精灵和碰撞检测
2021/11/17 Python
使用Oracle命令进行数据库备份与还原
2021/12/06 Oracle