小议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 相关文章推荐
云网广告中的代码,提示出错,大家找找
Nov 21 Javascript
教你如何解密js/vbs/vbscript加密的编码异处理小结
Jun 25 Javascript
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
Sep 26 Javascript
使用UglifyJS合并/压缩JavaScript的方法
Mar 07 Javascript
Jquery Post处理后不进入回调的原因及解决方法
Jul 15 Javascript
微信小程序 开发之全局配置
May 05 Javascript
使用JS和canvas实现gif动图的停止和播放代码
Sep 01 Javascript
微信小程序 MinUI组件库系列之badge徽章组件示例
Aug 20 Javascript
详解Vue源码之数据的代理访问
Dec 11 Javascript
JS数组splice操作实例分析
Oct 12 Javascript
Js参数RSA加密传输之jsencrypt.js的使用
Feb 07 Javascript
vue插槽slot的简单理解与用法实例分析
Mar 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
PHP curl模拟浏览器采集阿里巴巴的实现代码
2011/04/20 PHP
php代码书写习惯优化小结
2013/06/20 PHP
Laravel 5框架学习之Eloquent (laravel 的ORM)
2015/04/08 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
PHP匿名函数(闭包函数)详解
2019/03/22 PHP
javascript 中的 delete及delete运算符
2015/11/15 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
JS基础随笔(菜鸟必看篇)
2016/07/13 Javascript
Vue.js实例方法之生命周期详解
2017/07/03 Javascript
JS实现键值对遍历json数组功能示例
2018/05/30 Javascript
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
[jQuery] 事件和动画详解
2019/03/05 jQuery
浅析vue-router中params和query的区别
2019/12/24 Javascript
vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题
2020/07/31 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
2020/10/23 Javascript
python下如何让web元素的生成更简单的分析
2008/07/17 Python
Python 字符串操作实现代码(截取/替换/查找/分割)
2013/06/08 Python
Python中字符编码简介、方法及使用建议
2015/01/08 Python
Python遍历目录中的所有文件的方法
2016/07/08 Python
python样条插值的实现代码
2018/12/17 Python
Python获取航线信息并且制作成图的讲解
2019/01/03 Python
Python3中的bytes和str类型详解
2019/05/02 Python
分享PyCharm的几个使用技巧
2019/11/10 Python
Pytorch中index_select() 函数的实现理解
2019/11/19 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
2020/04/08 Python
用python制作个视频下载器
2021/02/01 Python
移动端Html5中百度地图的点击事件
2019/01/31 HTML / CSS
如何定义一个可复用的服务
2014/09/30 面试题
公司活动方案范文
2014/03/06 职场文书
组工干部演讲稿
2014/09/02 职场文书
解除劳动关系协议书2篇
2014/11/28 职场文书
学生考试舞弊检讨书
2015/01/01 职场文书
2015年库房管理工作总结
2015/10/14 职场文书
三好学生竞选稿范文
2019/08/21 职场文书
2019年大学生暑期社会实践调查报告模板
2019/11/07 职场文书
JavaScript与JQuery框架基础入门教程
2021/07/15 Javascript