深入理解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 源码分析笔记(5) jQuery.support
Jun 19 Javascript
jQuery Ajax请求状态管理器打包
May 03 Javascript
深入分析js的冒泡事件
Dec 05 Javascript
AngularJS入门知识之MVW类框架的编程思想探讨
Dec 08 Javascript
js动态创建及移除div的方法
Jun 03 Javascript
JS与jQ读取xml文件的方法
Dec 08 Javascript
详解Javascript数据类型的转换规则
Dec 12 Javascript
Javascript 详解封装from表单数据为json串进行ajax提交
Mar 29 Javascript
基于wordpress的ajax写法详解
Jan 02 Javascript
详解JWT token心得与使用实例
Aug 02 Javascript
jQuery实现二级导航菜单的示例
Sep 30 jQuery
关于IDEA中的.VUE文件报错 Export declarations are not supported by current JavaScript version
Oct 17 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设计模式 FlyWeight (享元模式)
2011/06/26 PHP
PHP数据过滤的方法
2013/10/30 PHP
Zend Framework动作助手Json用法实例分析
2016/03/05 PHP
php中关于长度计算容易混淆的问题分析
2016/05/27 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
prototype 源码中文说明之 prototype.js
2006/09/22 Javascript
按给定几率进行随机抽取的js代码
2010/12/28 Javascript
基于dom编程中 动态创建与删除元素的使用
2013/04/17 Javascript
验证控件与Button的OnClientClick事件详细解析
2013/12/04 Javascript
小巧强大的jquery layer弹窗弹层插件
2015/12/06 Javascript
jQuery动画效果实现图片无缝连续滚动
2016/01/12 Javascript
jQuery设置聚焦并使光标位置在文字最后的实现方法
2016/08/02 Javascript
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
node基于async/await对mysql进行封装
2019/06/20 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
基于axios 的responseType类型的设置方法
2019/10/29 Javascript
JS+Canvas实现五子棋游戏
2020/08/26 Javascript
Python编程之string相关操作实例详解
2017/07/22 Python
Python基于更相减损术实现求解最大公约数的方法
2018/04/04 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
2020/05/27 Python
Python 的AES加密与解密实现
2019/07/09 Python
tornado+celery的简单使用详解
2019/12/21 Python
PIL包中Image模块的convert()函数的具体使用
2020/02/26 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
在keras中实现查看其训练loss值
2020/06/16 Python
使用HTML5 Canvas API绘制弧线的教程
2016/03/22 HTML / CSS
美国顶级防滑鞋:Shoes For Crews
2017/03/27 全球购物
英国玛莎百货美国官网:Marks & Spencer美国
2018/11/06 全球购物
英国Flybe航空官网:欧洲最大的独立支线廉价航空公司
2019/07/15 全球购物
俄罗斯宠物用品网上商店:ZooMag
2019/12/12 全球购物
英国拖鞋购买网站:Bedroom Athletics
2020/02/28 全球购物
会议欢迎标语
2014/06/30 职场文书
法人身份证明书
2014/10/08 职场文书
工作年限证明模板
2015/06/15 职场文书
Feign调用传输文件异常的解决
2021/06/24 Java/Android