深入理解js generator数据类型


Posted in Javascript onAugust 16, 2016

1. 概述

generator 是ES6引入的新的数据类型, 看上去像一个函数,除了使用return返回, yield可以返回多次。

generator 由function* 定义, (注意*号),

2. 例子

函数无法保存状态, 有时需要全局变量来保存数字;

2.1

'use strict';

function next_id(){
  var id = 1;
  while(id<100){
   yield id;
   id++;
  }
  return id;
}

// 测试:
var
  x,
  pass = true,
  g = next_id();
for (x = 1; x < 100; x ++) {
  if (g.next().value !== x) {
    pass = false;
    alert('测试失败!');
    break;
  }


}
if (pass) {
  alert('测试通过!');
}

2.2 一个无限循环的迭代器

function* idMaker(){
  var index = 0;
  while(true)
    yield index++;
}

var gen = idMaker(); // "Generator { }"

console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2

2.3Generator.prototype.next()

当迭代结束时, Generator.next().done ===true, 结束之前 ===false

function* gen() { 
 yield 1;
 yield 2;
 yield 3;
}

var g = gen(); // "Generator { }"
g.next();   // "Object { value: 1, done: false }"
g.next();   // "Object { value: 2, done: false }"
g.next();   // "Object { value: 3, done: false }"
g.next();   // "Object { value: undefined, done: true }"

2.4 Generator.prototype.return();

return方法 返回给定的参数值,并结束迭代器

example

function* gen() { 
 yield 1;
 yield 2;
 yield 3;
}

var g = gen();

g.next();    // { value: 1, done: false }
g.return("foo"); // { value: "foo", done: true }
g.next();    // { value: undefined, done: true }

注意 如果 done的值是true了, 再调用return,返回的值也是undefined

function* gen() {yield 1;}
var g = gen();
console.log(g.next());//{ value: 1, done: false }
console.log(g.next());//{ value: undefined, done: true }
console.log(g.return(1)); //{ value: undefined, done: true }

2.5 Generator.prototype.throw()

thorw()方法, 通过抛出一个异常到迭代器中,来重新获得迭代器的执行;

返回 带有 value和done两个属性的object对象

function* gen() {
 while(true) {
  try {
    yield 42;
  } catch(e) {
   console.log("Error caught!");
  }
 }
}

var g = gen();
var a = g.next();
// { value: 42, done: false }
var b = g.throw(new Error("Something went wrong"));
// "Error caught!"
// { value: 42, done: false }
console.log(a);
console.log(b.value+"::"+b.done);

以上这篇深入理解js generator数据类型就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery代码优化之基本事件
Nov 01 Javascript
JS动态增加删除UL节点LI及相关内容示例
May 21 Javascript
js实现带关闭按钮始终显示在网页最底部工具条的方法
Mar 02 Javascript
JavaScript实现带播放列表的音乐播放器实例分享
Mar 07 Javascript
更靠谱的H5横竖屏检测方法(js代码)
Sep 13 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
Feb 21 Javascript
javascript 开发之百度地图使用到的js函数整理
May 19 Javascript
vue项目实战总结篇
Feb 11 Javascript
Vue.js 实现微信公众号菜单编辑器功能(一)
May 08 Javascript
vuex的module模块用法示例
Nov 12 Javascript
微信小程序 wepy框架与iview-weapp的用法详解
Apr 10 Javascript
Js Snowflake(雪花算法)生成随机ID的实现方法
Aug 26 Javascript
js 创建对象 经典模式全面了解
Aug 16 #Javascript
js 上传文件预览的简单实例
Aug 16 #Javascript
js removeChild 方法深入理解
Aug 16 #Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
Aug 16 #Javascript
总结Node.js中的一些错误类型
Aug 15 #Javascript
自动化测试读写64位操作系统的注册表
Aug 15 #Javascript
Wireshark基本介绍和学习TCP三次握手
Aug 15 #Javascript
You might like
PHP 强制下载文件代码
2010/10/24 PHP
php按单词截取字符串的方法
2015/04/07 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
2018/10/14 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
通过JavaScript控制字体大小的代码
2011/10/04 Javascript
js精度溢出解决方案
2012/12/02 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
最好用的省市二级联动 原生js实现你值得拥有
2013/09/22 Javascript
js实现全屏漂浮广告移入光标停止移动
2013/12/02 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
HTML5+jQuery实现搜索智能匹配功能
2017/03/24 jQuery
JS优化与惰性载入函数实例分析
2017/04/06 Javascript
在ABP框架中使用BootstrapTable组件的方法
2017/07/31 Javascript
优化Vue中date format的性能详解
2020/01/13 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
[07:43]《辉夜杯》公开赛晋级外卡赛战队—TRG训练生活探秘
2015/12/11 DOTA
python实现百度关键词排名查询
2014/03/30 Python
Python多线程结合队列下载百度音乐的方法
2015/07/27 Python
Python退火算法在高次方程的应用
2018/07/26 Python
Python使用装饰器模拟用户登陆验证功能示例
2018/08/24 Python
python 快速把超大txt文件转存为csv的实例
2018/10/26 Python
详解python中list的使用
2019/03/15 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
2019/09/02 Python
一行Python代码制作动态二维码的实现
2019/09/09 Python
Python函数的默认参数设计示例详解
2019/12/01 Python
keras中的backend.clip用法
2020/05/22 Python
详解python中的lambda与sorted函数
2020/09/04 Python
英国乐购杂货:Tesco Groceries
2018/11/29 全球购物
GWT的应用有哪两种部署模式
2012/12/21 面试题
安全生产一岗双责责任书
2014/07/28 职场文书
初三学生语文考试作弊检讨书
2014/12/14 职场文书
小学推普周活动总结
2015/05/07 职场文书
被委托人身份证明
2015/08/07 职场文书
Nginx反向代理配置的全过程记录
2021/06/22 Servers
Vue组件化(ref,props, mixin,.插件)详解
2022/05/15 Vue.js