JavaScript ES6 Generator 生成器详解:语法、API与异常处理

作者:纸飞机时间:2026-10-30 12:08:06浏览:370

本文详细解析JavaScript ES6引入的Generator生成器数据类型。涵盖function*定义语法、yield多次返回值机制,以及通过next、return和throw方法控制迭代流程。重点演示如何保存状态、处理无限循环迭代器,并说明done属性与value对象的返回逻辑,帮助开发者掌握异步编程基础。

Generator简介与定义语法

1. generator简介

Generator是ES6标准中引入的一种新型数据类型。从外观上看,它类似于普通函数,但具备独特行为:除了常规的return语句用于返回最终结果外,yield关键字允许函数在运行过程中多次暂停并返回值。

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

Generator示例与状态保存

2. 示例

普通函数在执行完毕后无法保留内部状态,若需跨调用保存数据(如数字计数),通常依赖全局变量。Generator通过内置的状态保存机制解决了这一问题。

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 

next()方法与迭代状态

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

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。


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()方法允许向迭代器内部抛出一个异常,从而重新获取迭代器的执行权并继续运行后续逻辑。

上述操作均返回一个包含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);

以上所述是小编给大家介绍的JavaScript中 ES6 generator数据类型详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对本站网站的支持!

作者最新文章