深入理解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 相关文章推荐
jqPlot jquery的页面图表绘制工具
Jul 25 Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
Apr 07 Javascript
使用jQuery操作Cookies的实现代码
Oct 09 Javascript
html中的input标签的checked属性jquery判断代码
Sep 19 Javascript
用javascript判断IE版本号简单实用且向后兼容
Sep 11 Javascript
Jquery Uploadify上传带进度条的简单实例
Feb 12 Javascript
JavaScript让Textarea支持tab按键的方法
Jun 26 Javascript
使用grunt合并压缩js和css文件的方法
Mar 02 Javascript
关于javascript获取内联样式与嵌入式样式的实例
Jun 01 Javascript
深入浅析javascript继承体系
Oct 23 Javascript
微信小程序使用picker实现时间和日期选择框功能【附源码下载】
Dec 11 Javascript
分享几个JavaScript运算符的使用技巧
Apr 24 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
discuz7 phpMysql操作类
2009/06/21 PHP
php查询相似度最高的字符串的方法
2015/03/12 PHP
JavaScript 对象链式操作测试代码
2010/04/25 Javascript
jquery下利用jsonp跨域访问实现方法
2010/07/29 Javascript
jquery 实现表单验证功能代码(简洁)
2012/07/03 Javascript
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
JavaScript动态创建form表单并提交的实现方法
2015/12/10 Javascript
基于JavaScript实现图片点击弹出窗口而不是保存
2016/02/06 Javascript
js 动态给元素添加、移除事件的实现方法
2016/07/19 Javascript
针对后台列表table拖拽比较实用的jquery拖动排序
2016/10/10 Javascript
解决浏览器会自动填充密码的问题
2017/04/28 Javascript
nodejs爬虫初试superagent和cheerio
2018/03/05 NodeJs
JS中call和apply函数用法实例分析
2018/06/20 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
[50:54]完美世界DOTA2联赛 GXR vs IO 第三场 11.07
2020/11/10 DOTA
python清除字符串里非字母字符的方法
2015/07/02 Python
Python如何实现守护进程的方法示例
2017/02/08 Python
python中WSGI是什么,Python应用WSGI详解
2017/11/24 Python
python删除过期log文件操作实例解析
2018/01/31 Python
TensorFlow变量管理详解
2018/03/10 Python
对dataframe进行列相加,行相加的实例
2018/06/08 Python
python使用Plotly绘图工具绘制水平条形图
2020/03/25 Python
python 获取等间隔的数组实例
2019/07/04 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
2020/07/09 Python
python和go语言的区别是什么
2020/07/20 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
名人珠宝设计师:Melinda Maria Jewelry
2019/03/06 全球购物
曼城官方网上商店:Manchester City
2019/09/10 全球购物
幼儿园中班新学期寄语
2014/01/18 职场文书
小学生红领巾广播稿
2014/01/21 职场文书
公司借款担保书
2015/09/22 职场文书
护士岗前培训心得体会
2016/01/08 职场文书
使用pandas生成/读取csv文件的方法实例
2021/07/09 Python
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS