深入理解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 相关文章推荐
javascript 屏蔽鼠标键盘的几段代码
Jan 02 Javascript
javascript小数四舍五入多种方法实现
Dec 23 Javascript
jquery中append()与appendto()用法分析
Nov 14 Javascript
jquery中filter方法用法实例分析
Feb 06 Javascript
JavaScript Split()方法
Dec 18 Javascript
vue2.0+webpack环境的构造过程
Nov 08 Javascript
jQuery常见的选择器及用法介绍
Dec 20 Javascript
关于在vue 中使用百度ueEditor编辑器的方法实例代码
Sep 14 Javascript
实例讲解JavaScript截取字符串
Nov 30 Javascript
js中的数组对象排序分析
Dec 11 Javascript
详解50行代码,Node爬虫练手项目
Apr 22 Javascript
Vue的生命周期一起来看看
Feb 24 Vue.js
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-pcntl 实现多进程代码
2016/09/30 PHP
Laravel使用原生sql语句并调用的方法
2019/10/09 PHP
获取表单控件原始(初始)值的方法
2013/08/21 Javascript
jquery通过select列表选择框对表格数据进行过滤示例
2014/05/07 Javascript
jQuery函数的第二个参数获取指定上下文中的DOM元素
2014/05/19 Javascript
纯JavaScript实现获取onclick、onchange等事件的值
2014/12/29 Javascript
基于jquery实现页面滚动时顶部导航显示隐藏
2020/04/20 Javascript
AngularJS中实现显示或隐藏动画效果的方式总结
2015/12/31 Javascript
jquery解析XML及获取XML节点名称的实现代码
2016/05/18 Javascript
浅析jquery数组删除指定元素的方法:grep()
2016/05/19 Javascript
vue组件如何被其他项目引用
2017/04/13 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
NodeJS简单实现WebSocket功能示例
2018/02/10 NodeJs
Vue中对比scoped css和css module的区别
2018/05/17 Javascript
jQuery插件实现弹性运动完整示例
2018/07/07 jQuery
JavaScript如何实现元素全排列实例代码
2019/05/14 Javascript
Vue+axios+WebApi+NPOI导出Excel文件实例方法
2019/06/05 Javascript
vue实现输入一位数字转汉字功能
2019/12/13 Javascript
JavaScript设计模式之门面模式原理与实现方法分析
2020/03/09 Javascript
Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
2020/04/27 Javascript
利用JS判断元素是否为数组的方法示例
2021/01/08 Javascript
[34:47]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第一场 11.18
2020/11/18 DOTA
python dict remove数组删除(del,pop)
2013/03/24 Python
python批量修改文件名的实现代码
2014/09/01 Python
用python实现百度翻译的示例代码
2018/03/09 Python
python 对txt中每行内容进行批量替换的方法
2018/07/11 Python
python实现知乎高颜值图片爬取
2019/08/12 Python
Django中间件拦截未登录url实例详解
2019/09/03 Python
Python如何爬取b站热门视频并导入Excel
2020/08/10 Python
python实现磁盘日志清理的示例
2020/11/05 Python
英国PC组件和在线电脑商店:SCAN
2019/04/18 全球购物
高中生学期学习自我评价
2014/02/24 职场文书
精彩广告词大全
2014/03/19 职场文书
促销活动总结
2014/04/28 职场文书
学生会竞选演讲稿学习部
2014/08/25 职场文书