小议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 相关文章推荐
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
May 21 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
Aug 12 Javascript
jQuery下的动画处理总结
Oct 10 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
Nov 19 Javascript
jquery自定义函数的多种方法
Jan 09 Javascript
jquery判断元素的子元素是否存在的示例代码
Feb 04 Javascript
用box固定长宽实现图片自动轮播js代码
Jun 09 Javascript
Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法
Sep 01 Javascript
浅谈轻量级js模板引擎simplite
Feb 13 Javascript
vue单页面打包文件大?首次加载慢?nginx带你飞,从7.5M到1.3M蜕变过程(推荐)
Jan 16 Javascript
angularJs利用$scope处理升降序的方法
Oct 08 Javascript
js原生map实现的方法总结
Jan 19 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实现快速排序的三种方法分享
2014/03/12 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
2014/06/30 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
JavaScript实现QueryString获取GET参数的方法
2013/07/02 Javascript
jquery中页面Ajax方法$.load的功能使用介绍
2014/10/20 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
jQuery遮罩层效果实例分析
2016/01/14 Javascript
javascript单页面手势滑屏切换原理详解
2016/03/21 Javascript
js编写当天简单日历效果【实现代码】
2016/05/03 Javascript
浅谈JavaScript中的分支结构
2016/07/01 Javascript
JavaScript实现事件的中断传播和行为阻止方法示例
2017/01/20 Javascript
d3.js中冷门却实用的内置函数总结
2017/02/04 Javascript
使用Object.defineProperty如何巧妙找到修改某个变量的准确代码位置
2018/11/02 Javascript
python strip()函数 介绍
2013/05/24 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
2017/06/01 Python
python学习必备知识汇总
2017/09/08 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
python scrapy爬虫代码及填坑
2019/08/12 Python
将HTML5 Canvas的内容保存为图片借助toDataURL实现
2013/05/20 HTML / CSS
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
HTML5 canvas基本绘图之绘制曲线
2016/06/27 HTML / CSS
俄罗斯和世界各地的酒店预订:Hotels.com俄罗斯
2016/08/19 全球购物
德国综合购物网站:OTTO
2018/11/13 全球购物
软件测试企业面试试卷
2016/07/13 面试题
大学毕业生自荐书怎么写?
2014/01/06 职场文书
出纳工作岗位责任制
2014/02/02 职场文书
宣传保护环境的公益广告词
2014/03/13 职场文书
幼儿学前班评语
2014/12/29 职场文书
患者身份识别制度
2015/08/06 职场文书
导游词之上海杜莎夫人蜡像馆
2019/11/22 职场文书
Python 如何实现文件自动去重
2021/06/02 Python
python unittest单元测试的步骤分析
2021/08/02 Python
MySQL中int (10) 和 int (11) 的区别
2022/01/22 MySQL
CDPR谈《巫师》新作用虚幻5原因 称不会为Epic独占
2022/04/06 其他游戏