深入理解JS Generator数据类型

作者:小括号时间:2026-10-30 12:17:03浏览:584

本文深入解析ES6引入的Generator数据类型,阐述其作为特殊函数的特性。通过function*定义,利用yield实现多次返回值及状态保存。详细演示next、return和throw方法的用法,包括done属性判断、提前终止迭代及异常处理机制,帮助开发者掌握异步编程与状态管理技巧。

Generator概述与定义

1. 概述

Generator是ES6规范中引入的一种新数据类型,其外观类似于普通函数,但具备独特行为。除了常规的return语句用于返回最终结果外,Generator还允许使用yield关键字多次返回值,从而实现暂停与恢复执行的能力。

在代码定义上,Generator函数必须使用function*语法进行声明,其中星号(*)是标识Generator的关键符号,不可省略。

Generator实例与迭代控制

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 }"

next与return方法详解

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方法,其返回值中的value将变为undefined,尽管done仍为true。


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 }

throw方法与异常处理

2.5 Generator.prototype.throw()

throw()方法用于向Generator内部抛出一个异常,借此机制可以重新获取迭代器的执行权,常用于错误恢复或控制流跳转。

无论调用next、return还是throw,Generator相关方法最终都返回一个包含value和done两个属性的对象,用于描述当前迭代状态及返回值。


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数据类型就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。

作者最新文章