深入理解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阻止冒泡和HTML默认操作
Nov 17 Javascript
JS中的public和private对象,即static修饰符
Jan 18 Javascript
javascript中数组的冒泡排序使用示例
Dec 18 Javascript
原生js实现addClass,removeClass,hasClass方法
Apr 27 Javascript
浅析jQuery Ajax通用js封装
Jun 22 Javascript
jQuery多文件异步上传带进度条实例代码
Aug 16 Javascript
javascript 利用arguments实现可变长参数
Nov 21 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
Dec 19 Javascript
JavaScript面试出现频繁的一些易错点整理
Mar 29 Javascript
JavaScript中变量提升与函数提升经典实例分析
Jul 26 Javascript
解决vuecli3.0热更新失效的问题
Sep 19 Javascript
vue 巧用过渡效果(小结)
Sep 22 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 Undefined index和Undefined variable的解决方法
2008/03/27 PHP
php 缩略图实现函数代码
2011/06/23 PHP
PHP实现懒加载的方法
2015/03/07 PHP
php通过array_push()函数添加多个变量到数组末尾的方法
2015/03/18 PHP
反射调用private方法实践(php、java)
2015/12/21 PHP
浅谈PHP面向对象之访问者模式+组合模式
2017/05/22 PHP
php PDO属性设置与操作方法分析
2018/12/27 PHP
Jquery 基础学习笔记
2009/05/29 Javascript
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
js中设置元素class的三种方法小结
2011/08/28 Javascript
jQuery Trim去除字符串首尾空字符的实现方法说明
2014/02/11 Javascript
JQuery中操作Css样式的方法
2014/02/12 Javascript
jQuery中parent()方法用法实例
2015/01/07 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
2015/09/26 Javascript
Nodejs对postgresql基本操作的封装方法
2019/02/20 NodeJs
简单通过settimeout看javascript的运行机制
2019/05/10 Javascript
细说webpack6 Babel的使用详解
2019/09/26 Javascript
vue-router 控制路由权限的实现
2020/09/24 Javascript
Python Web开发模板引擎优缺点总结
2014/05/06 Python
基于Python的接口测试框架实例
2016/11/04 Python
老生常谈python的私有公有属性(必看篇)
2017/06/09 Python
对python抓取需要登录网站数据的方法详解
2018/05/21 Python
Python面向对象实现一个对象调用另一个对象操作示例
2019/04/08 Python
python实现FTP文件传输的方法(服务器端和客户端)
2020/03/20 Python
PyCharm Anaconda配置PyQt5开发环境及创建项目的教程详解
2020/03/24 Python
用于ETL的Python数据转换工具详解
2020/07/21 Python
python 获取谷歌浏览器保存的密码
2021/01/06 Python
新西兰领先的内衣店:Bendon Lingerie新西兰
2018/07/11 全球购物
美国围栏公司:Walpole Outdoors
2019/11/19 全球购物
傲盾软件面试题
2015/08/17 面试题
竞选班干部演讲稿300字
2014/08/20 职场文书
学校元旦晚会开场白
2014/12/14 职场文书
投标邀请书范本
2015/02/02 职场文书
软件项目经理岗位职责
2015/04/01 职场文书
学习商务礼仪心得体会
2016/01/22 职场文书
sqlserver连接错误之SQL评估期已过的问题解决
2022/03/23 SQL Server