小议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 相关文章推荐
window.onload 加载完毕的问题及解决方案(上)
Jul 09 Javascript
理解Javascript_14_函数形式参数与arguments
Oct 20 Javascript
javascript操作referer详细解析
Mar 10 Javascript
2016年最热门的15 款代码语法高亮工具,美化你的代码
Jan 06 Javascript
javascript经典特效分享 手风琴、轮播图、图片滑动
Sep 14 Javascript
Bootstrap基本组件学习笔记之input输入框组(9)
Dec 07 Javascript
微信小程序使用radio显示单选项功能【附源码下载】
Dec 11 Javascript
React Native之prop-types进行属性确认详解
Dec 19 Javascript
简化版的vue-router实现思路详解
Oct 19 Javascript
小程序自定义日历效果
Dec 29 Javascript
vue 使用async写数字动态加载效果案例
Jul 18 Javascript
react antd实现动态增减表单
Jun 03 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
第六节 访问属性和方法 [6]
2006/10/09 PHP
PHP 类相关函数的使用详解
2013/05/10 PHP
PHP生成二维码的两个方法和实例
2014/07/01 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
2016/01/22 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
PHP 断点续传实例详解
2017/11/11 PHP
javascript对talbe进行动态添加、删除、验证实现代码
2012/03/29 Javascript
深入理解JavaScript系列(27):设计模式之建造者模式详解
2015/03/03 Javascript
微信小程序之ES6与事项助手的功能实现
2016/11/30 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
2017/01/21 Javascript
JQuery validate 验证一个单独的表单元素实例
2017/02/17 Javascript
深入剖析Node.js cluster模块
2018/05/23 Javascript
javascript标准库(js的标准内置对象)总结
2018/05/26 Javascript
详解vue通过NGINX部署在子目录或者二级目录实践
2018/09/03 Javascript
一步快速解决微信小程序中textarea层级太高遮挡其他组件
2019/03/04 Javascript
Webpack中SplitChunksPlugin 配置参数详解
2020/03/24 Javascript
基于Vue实现微前端的示例代码
2020/04/24 Javascript
VUE : vue-cli中去掉路由中的井号#操作
2020/09/04 Javascript
[01:14:05]《加油DOTA》第四期
2014/08/25 DOTA
python通过colorama模块在控制台输出彩色文字的方法
2015/03/19 Python
python中set常用操作汇总
2016/06/30 Python
python3.4下django集成使用xadmin后台的方法
2017/08/15 Python
tensorflow更改变量的值实例
2018/07/30 Python
python 多线程串行和并行的实例
2019/02/22 Python
初探利用Python进行图文识别(OCR)
2019/02/26 Python
Django模型序列化返回自然主键值示例代码
2019/06/12 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
日本卡普空电视游戏软件公司官方购物网站:e-CAPCOM
2018/07/17 全球购物
结构和类有什么异同
2012/07/16 面试题
后勤人员自我鉴定
2013/10/20 职场文书
服务承诺书范文
2014/05/19 职场文书
小学六一儿童节活动方案
2014/08/27 职场文书
公司领导班子对照检查材料
2014/09/24 职场文书
同学会邀请函模板
2015/01/30 职场文书
Python机器学习算法之决策树算法的实现与优缺点
2021/05/13 Python
Python机器学习应用之工业蒸汽数据分析篇详解
2022/01/18 Python