小议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静态的动态
Sep 18 Javascript
基于Jquery的仿照flash放大图片效果代码
Mar 16 Javascript
JS刷新框架外页面七种实现代码
Feb 18 Javascript
js与jQuery 获取父窗、子窗的iframe
Dec 20 Javascript
jQuery select自动选中功能实现方法分析
Nov 28 Javascript
javascript动画之磁性吸附效果篇
Dec 09 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
Jan 26 Javascript
jquery横向纵向鼠标滚轮全屏切换
Feb 27 Javascript
vue loadmore 组件滑动加载更多源码解析
Jul 19 Javascript
Vue.js中的图片引用路径的方式
Jul 28 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
Sep 27 Javascript
vue+springboot图片上传和显示的示例代码
Feb 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
星际玩家的三大定律
2020/03/04 星际争霸
Laravel 5框架学习之向视图传送数据(进阶篇)
2015/04/08 PHP
Zend Framework教程之资源(Resources)用法实例详解
2016/03/14 PHP
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
2011/02/24 Javascript
自定义ExtJS控件之下拉树和下拉表格附源码
2013/10/15 Javascript
jQuery中before()方法用法实例
2014/12/25 Javascript
jQuery元素的隐藏与显示实例
2015/01/20 Javascript
JS扩展方法实例分析
2015/04/15 Javascript
JQuery使用index方法获取Jquery对象数组下标的方法
2015/05/18 Javascript
jQuery中cookie插件用法实例分析
2015/12/04 Javascript
将List对象列表转换成JSON格式的类实现方法
2016/07/04 Javascript
node.js缺少mysql模块运行报错的解决方法
2016/11/13 Javascript
JS实现间歇滚动的运动效果实例
2016/12/22 Javascript
js操作二进制数据方法
2018/03/03 Javascript
angular 内存溢出的问题解决
2018/07/12 Javascript
详解微信小程序开发(项目从零开始)
2019/06/06 Javascript
nodejs一个简单的文件服务器的创建方法
2019/09/13 NodeJs
antd Form组件方法getFieldsValue获取自定义组件的值操作
2020/10/29 Javascript
Python的Bottle框架中返回静态文件和JSON对象的方法
2015/04/30 Python
Python字符串拼接六种方法介绍
2017/12/18 Python
python 3.6.5 安装配置方法图文教程
2018/09/18 Python
Django ManyToManyField 跨越中间表查询的方法
2018/12/18 Python
Python批量生成幻影坦克图片实例代码
2019/06/04 Python
python lambda的使用详解
2021/02/26 Python
利用Node实现HTML5离线存储的方法
2020/10/16 HTML / CSS
全球领先美式家具品牌:Ashley爱室丽家居
2017/08/07 全球购物
英国领先的在线高尔夫商店:Scottsdale Golf
2019/08/26 全球购物
美国名牌手表折扣网站:Jomashop
2020/05/22 全球购物
自我推荐书
2013/12/04 职场文书
军人违纪检讨书
2014/02/04 职场文书
感恩母亲节活动方案
2014/03/04 职场文书
员工安全承诺书
2014/05/22 职场文书
向国旗敬礼活动小结
2014/09/27 职场文书
一文弄懂MySQL索引创建原则
2022/02/28 MySQL
Java实现添加条码或二维码到Word文档
2022/06/01 Java/Android