小议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 相关文章推荐
商城常用滚动的焦点图效果代码简单实用
Mar 28 Javascript
jQuery实现的一个自定义Placeholder属性插件
Aug 11 Javascript
使用AngularJS处理单选框和复选框的简单方法
Jun 19 Javascript
JavaScript实现的微信二维码图片生成器的示例
Oct 26 Javascript
详谈jQuery Ajax(load,post,get,ajax)的用法
Mar 02 Javascript
Javascript中引用类型传递的知识点小结
Mar 06 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
Apr 13 jQuery
纯JS实现只能输入数字的简单代码
Jun 21 Javascript
vue双花括号的使用方法 附练习题
Nov 07 Javascript
vue-router动态设置页面title的实例讲解
Aug 30 Javascript
Vue-cli3项目引入Typescript的实现方法
Oct 18 Javascript
vue 实现setInterval 创建和销毁实例
Jul 21 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
解析thinkphp基本配置 convention.php
2013/06/18 PHP
php中分页及SqlHelper类用法实例
2017/01/12 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
Javascript客户端将指定区域导出到Word、Excel的代码
2008/10/22 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
2014/12/20 Javascript
详解JavaScript中的客户端消息框架设计原理
2015/06/24 Javascript
纯javascript实现的小游戏《Flappy Pig》实例
2015/07/27 Javascript
js鼠标点击图片切换效果代码分享
2015/08/26 Javascript
jquery实现树形菜单完整代码
2015/12/29 Javascript
基于jQuery实现动态搜索显示功能
2016/05/05 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
2016/06/02 Javascript
详解Vue生命周期的示例
2017/03/10 Javascript
解决Vue2.x父组件与子组件之间的双向绑定问题
2018/03/06 Javascript
Vue.js 中的实用工具方法【推荐】
2019/07/04 Javascript
layui 解决form表单点击无反应的问题
2019/10/25 Javascript
javascript设计模式之迭代器模式
2020/01/30 Javascript
前端深入理解Typescript泛型概念
2020/03/09 Javascript
Python调用C++程序的方法详解
2017/01/24 Python
Django模板变量如何传递给外部js调用的方法小结
2017/07/24 Python
Python星号*与**用法分析
2018/02/02 Python
Python何时应该使用Lambda函数
2019/07/02 Python
在Python中获取操作系统的进程信息
2019/08/27 Python
Python使用random模块生成随机数操作实例详解
2019/09/17 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
2020/02/27 Python
使用python实现CGI环境搭建过程解析
2020/04/28 Python
python属于软件吗
2020/06/18 Python
python 绘制正态曲线的示例
2020/09/24 Python
python操作toml文件的示例代码
2020/11/27 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
手机促销活动方案
2014/02/05 职场文书
反腐倡廉主题教育活动总结
2015/05/07 职场文书
Nginx如何配置Http、Https、WS、WSS的方法步骤
2021/05/11 Servers
Appium中scroll和drag_and_drop根据元素位置滑动
2022/02/15 Python
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python
javascript进阶篇深拷贝实现的四种方式
2022/07/07 Javascript
volatile保证可见性及重排序方法
2022/08/05 Java/Android