小议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中 For, While与递归的用法
May 07 Javascript
7个JS基础知识总结
Mar 05 Javascript
JavaScript对IE操作的经典代码(推荐)
Mar 10 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
Sep 04 Javascript
原生js实现图片轮播特效
Dec 18 Javascript
JavaScript中的原始值和复杂值
Jan 07 Javascript
本地Bootstrap文件字体图标引入却无法显示问题的解决方法
Apr 18 Javascript
Vue过滤器的用法和自定义过滤器使用
Feb 08 Javascript
JS+Ajax实现百度智能搜索框
Aug 04 Javascript
JavaScript运行原理分析
Feb 09 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
Jul 23 Javascript
vue实现简易计算器功能
Jan 20 Vue.js
浅析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静态类
2006/11/25 PHP
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
2011/08/09 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
2014/03/13 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
2016/11/12 PHP
laradock环境docker-compose操作详解
2019/07/29 PHP
列表内容的选择
2006/06/30 Javascript
关于html+ashx开发中几个问题的解决方法
2011/07/18 Javascript
JS重要知识点小结
2011/11/06 Javascript
说说JSON和JSONP 也许你会豁然开朗
2012/09/02 Javascript
jQuery实现鼠标划过展示大图的方法
2015/03/09 Javascript
Winform客户端向web地址传参接收参数的方法
2016/05/17 Javascript
用jmSlip编写移动端顶部日历选择控件
2016/10/24 Javascript
Ionic+AngularJS实现登录和注册带验证功能
2017/02/09 Javascript
vue双向数据绑定知识点总结
2018/04/18 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
2018/09/14 Javascript
巧妙运用v-model实现父子组件传值的方法示例
2019/04/07 Javascript
vue的列表交错过渡实现代码示例
2019/05/05 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
jquery实现弹窗(系统提示框)效果
2019/12/10 jQuery
python通过smpt发送邮件的方法
2015/04/30 Python
利用Tkinter(python3.6)实现一个简单计算器
2017/12/21 Python
微信跳一跳自动运行python脚本
2018/01/08 Python
Python设计模式之MVC模式简单示例
2018/01/10 Python
对Python3中的input函数详解
2018/04/22 Python
python中pygame安装过程(超级详细)
2019/08/04 Python
详细分析Python垃圾回收机制
2020/07/01 Python
Python使用shutil模块实现文件拷贝
2020/07/31 Python
使用Python提取文本中含有特定字符串的方法示例
2020/12/09 Python
用CSS3绘制三角形的简单方法
2015/07/17 HTML / CSS
社团文化节策划书
2014/02/01 职场文书
大学国际贸易专业自荐信
2014/06/05 职场文书
施工安全协议书范本
2014/09/26 职场文书
高校群众路线教育实践活动剖析材料
2014/10/10 职场文书
电影焦裕禄观后感
2015/06/09 职场文书
吃通javascript正则表达式
2021/04/21 Javascript
PyTorch中的torch.cat简单介绍
2022/03/17 Python