深入理解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学习阶段性总结(2)--(X)HTML学习
Feb 03 Javascript
父子窗体间传递JSON格式的数据的代码
Dec 25 Javascript
js制作简易年历完整实例
Jan 28 Javascript
利用jQuery中的ajax分页实现代码
Feb 25 Javascript
jquery与ajax获取特殊字符实例详解
Jan 08 Javascript
js实现类bootstrap模态框动画
Feb 07 Javascript
详解Layer弹出层样式
Aug 21 Javascript
详解VUE里子组件如何获取父组件动态变化的值
Dec 26 Javascript
vue+element-ui+axios实现图片上传
Aug 20 Javascript
Paypal支付不完全指北
Jun 04 Javascript
vue自定义树状结构图的实现方法
Oct 18 Javascript
vue中defineProperty和Proxy的区别详解
Nov 30 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模拟asp中的XmlHttpRequest实现http请求的代码
2011/03/24 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
php注册登录系统简化版
2020/12/28 PHP
PHP+Session防止表单重复提交的解决方法
2018/04/09 PHP
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
ExtJS 简介 让你知道extjs是什么
2008/12/29 Javascript
页面中body onload 和 window.onload 冲突的问题的解决
2009/07/01 Javascript
JQuery加载图片自适应固定大小的DIV
2013/09/12 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
jquery实现背景墙聚光灯效果示例分享
2014/03/02 Javascript
javascript正则匹配汉字、数字、字母、下划线
2014/04/10 Javascript
js文本框走动跑马灯效果代码分享
2015/08/25 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
微信小程序网络请求的封装与填坑之路
2017/04/01 Javascript
web前端vue之vuex单独一文件使用方式实例详解
2018/01/11 Javascript
在Python中使用Mako模版库的简单教程
2015/04/08 Python
详解Python中的strftime()方法的使用
2015/05/22 Python
Python随机数random模块使用指南
2016/09/09 Python
Python简单过滤字母和数字的方法小结
2019/01/09 Python
使用Python实现批量ping操作方法
2020/05/06 Python
CSS3打造磨砂玻璃背景效果
2016/09/28 HTML / CSS
HTML5表单验证特性(知识点小结)
2020/03/10 HTML / CSS
悬挂训练绳:TRX
2017/12/14 全球购物
说出你对remoting 和webservice的理解和应用
2014/06/08 面试题
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
2012/05/30 面试题
护理专业的自荐信
2013/10/22 职场文书
传媒专业推荐信范文
2013/11/23 职场文书
即兴演讲稿
2014/01/04 职场文书
劳动模范事迹材料
2014/01/19 职场文书
幼儿园庆六一活动方案
2014/03/06 职场文书
经典演讲稿汇总
2014/05/19 职场文书
2014年学习部工作总结
2014/11/12 职场文书
英文导游词
2015/02/13 职场文书
2016特色励志班级口号
2015/12/24 职场文书
Redis集群的关闭与重启操作
2021/07/07 Redis