JavaScript ES6 Generator 生成器详解:语法、API与异常处理
本文详细解析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数据类型详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对本站网站的支持!
JS动态构建复杂嵌套JSON对象的方法
2026-11-05 15:41:52
JS负数取余为什么是负数?详解余数与模运算区别
2026-11-05 13:34:41
JS 解压出现乱码或报错怎么解决?
2026-11-05 12:32:38
JS 中 startsWith、indexOf 与正则判断字符串前缀的对比
2026-11-04 22:19:43
JS解析Excel后怎么将数据转换为JSON格式
2026-11-04 20:58:28
