深入理解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中获取未知对象属性的代码
Apr 27 Javascript
Jquery 的扩展方法总结
Oct 01 Javascript
游览器中javascript的执行过程(图文)
May 20 Javascript
JS求平均值的小例子
Nov 29 Javascript
JS控制图片等比例缩放的示例代码
Dec 24 Javascript
javascript制作照片墙及制作过程中出现的问题
Apr 04 Javascript
jQuery按需加载轮播图(web前端性能优化)
Feb 17 Javascript
在Vue项目中引入腾讯验证码服务的教程
Apr 03 Javascript
在vue中v-bind使用三目运算符绑定class的实例
Sep 29 Javascript
js防抖和节流的深入讲解
Dec 06 Javascript
vue简单封装axios插件和接口的统一管理操作示例
Feb 02 Javascript
谈谈JavaScript中的函数
Sep 08 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 之 写时复制介绍(Copy On Write)
2014/05/13 PHP
PHP实现简单搜歌的方法
2015/07/28 PHP
js获取select标签选中值的两种方式
2014/01/09 Javascript
JQuery的Ajax请求实现局部刷新的简单实例
2014/02/11 Javascript
对Jquery中的ajax再封装,简化操作示例
2014/02/12 Javascript
jquery限定文本框只能输入数字(整数和小数)
2016/01/08 Javascript
使用getBoundingClientRect方法实现简洁的sticky组件的方法
2016/03/22 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
2016/09/08 Javascript
JavaScript中的编码和解码函数
2017/02/15 Javascript
AngularJs实现聊天列表实时刷新功能
2017/06/15 Javascript
JS实现的数组去除重复数据算法小结
2017/11/17 Javascript
利用vue+elementUI实现部分引入组件的方法详解
2017/11/22 Javascript
vue 全选与反选的实现方法(无Bug 新手看过来)
2018/02/09 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
2018/09/14 Javascript
[01:22]DOTA2神秘商店携大量周边降临完美大师赛
2017/11/07 DOTA
python支持断点续传的多线程下载示例
2014/01/16 Python
Python实现完整的事务操作示例
2017/06/20 Python
python使用fork实现守护进程的方法
2017/11/16 Python
Python内置函数——__import__ 的使用方法
2017/11/24 Python
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
python 切换root 执行命令的方法
2019/01/19 Python
wxPython实现整点报时
2019/11/18 Python
python 求定积分和不定积分示例
2019/11/20 Python
巧用HTML5给按钮背景设计不同的动画简单实例
2016/08/09 HTML / CSS
意大利运动服减价商店:ScontoSport
2020/03/10 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
应届毕业生就业自荐信
2013/10/26 职场文书
总经理助理的职责
2014/03/14 职场文书
星级党支部申报材料
2014/05/31 职场文书
专项法律服务方案
2014/06/11 职场文书
暂停营业通知
2015/04/25 职场文书
导游词之无锡华莱坞
2019/12/02 职场文书
Idea连接MySQL数据库出现中文乱码的问题
2021/04/14 MySQL
详细聊聊vue中组件的props属性
2021/11/02 Vue.js
使用Ajax实现进度条的绘制
2022/04/07 Javascript