深入理解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 相关文章推荐
js如何实现设计模式中的模板方法
Jul 23 Javascript
JQUERY 设置SELECT选中项代码
Feb 07 Javascript
JavaScript使用addEventListener添加事件监听用法实例
Jun 01 Javascript
JS实现可展开折叠层的鼠标拖曳效果
Oct 09 Javascript
网页挂马方式整理及详细介绍
Nov 03 Javascript
jquery validation验证表单插件
Jan 07 Javascript
jQuery序列化后的表单值转换成Json
Jun 16 jQuery
knockoutjs模板实现树形结构列表
Jul 31 Javascript
vue源码解析之事件机制原理
Apr 21 Javascript
JS实现点餐自动选择框(案例分析)
Dec 10 Javascript
解决qrcode.js生成二维码时必须定义一个空div的问题
Jul 09 Javascript
解决antd的Form组件setFieldsValue的警告问题
Oct 29 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
转生史莱姆:萌王第一次撸串开心到飞起,哥布塔撸串却神似界王神
2018/11/30 日漫
php下MYSQL limit的优化
2008/01/10 PHP
PHP中利用substr_replace将指定两位置之间的字符替换为*号
2011/01/27 PHP
WordPress主题制作之模板文件的引入方法
2015/12/28 PHP
浅谈PHP中try{}catch{}的使用方法
2016/12/09 PHP
laravel 实现根据字段不同值做不同查询
2019/10/23 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
2019/10/30 PHP
PHP7 新增常量
2021/03/09 PHP
添加到收藏夹代码(兼容几乎所有的浏览器)
2007/01/09 Javascript
js滚动条多种样式,推荐
2007/02/05 Javascript
Jquery Validation插件防止重复提交表单的解决方法
2010/03/05 Javascript
JavaScript中也使用$美元符号来代替document.getElementById
2010/06/19 Javascript
自己实现string的substring方法 人民币小写转大写,数字反转,正则优化
2012/09/02 Javascript
简单的两种Extjs formpanel加载数据的方式
2013/11/09 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
2013/12/14 Javascript
JS实现控制表格只显示行边框或者只显示列边框的方法
2015/03/31 Javascript
JavaScript中的cacheStorage使用详解
2015/07/29 Javascript
jQuery实现TAB风格的全国省份城市滑动切换效果代码
2015/08/24 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
关于Vue.js一些问题和思考学习笔记(1)
2016/12/02 Javascript
React利用插件和不用插件实现双向绑定的方法详解
2017/07/03 Javascript
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
使用百度地图实现地图网格的示例
2018/02/06 Javascript
vue 做移动端微信公众号采坑经验记录
2018/04/26 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
2019/09/16 Javascript
Python+Django在windows下的开发环境配置图解
2009/11/11 Python
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
2019/08/05 Python
浅谈Pycharm最有必要改的几个默认设置项
2020/02/14 Python
Python3中对json格式数据的分析处理
2021/01/28 Python
一款基于css3麻将筛子3D翻转特效的实例教程
2014/12/31 HTML / CSS
实现向右循环移位
2014/07/31 面试题
毕业实习感受与体会
2015/05/26 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书
Python实现老照片修复之上色小技巧
2021/10/16 Python