ES6 从入门到精通 # 15:生成器 Generator 的用法

说明

ES6 从入门到精通系列(全23讲)学习笔记。

generator 函数

可以通过 yield 关键字将函数挂起,为了改变执行流提供了可能,同时为了做异步编程提供了方案

跟普通函数的区别:

  1. function 后面,函数名之前有个 *
  2. 只能在函数内部使用 yield 表达式,让函数挂起
function * func() {
	yield 3;
	yield 1;
	yield 2;
}
// 返回一个遍历器,可以调用 next()
let kaimo = func();
console.log(kaimo)
console.log(kaimo.next())
console.log(kaimo.next())
console.log(kaimo.next())
console.log(kaimo.next())

在这里插入图片描述

总结:generator 函数是分段执行的,yield 语句是暂停执行,而 next() 恢复执行

function * func() {
	console.log("start")
	let x = yield 3;
	console.log("x-->", x)
	let y = yield 1;
	console.log("y-->", y)
	let z = yield 2;
	console.log("z-->", z)
	return x + y + z;
}
let kaimo = func();
console.log(kaimo.next(10))
console.log(kaimo.next(20))
console.log(kaimo.next(30))
console.log(kaimo.next(40))
console.log(kaimo.next(50))

在这里插入图片描述

这里的 let x = yield 2; 表达式里的 x 不是 yield 2 返回值,它是 next() 调用恢复当前 yield 执行传入的实参。所以这里的 x 是 20。

使用场景

为不具备 iterator 接口的对象提供遍历操作

function * objectEntries(obj) {
	// 获取对象的所有keys保存到数组 [name, value]
	const propKeys = Object.keys(obj);
	for(const propkey of propKeys) {
		yield [propkey, obj[propkey]]
	}
}
const kaimo = {
	name: "凯小默",
	value: "kaimo313"
}
kaimo[Symbol.iterator] =  objectEntries(kaimo);
console.log(kaimo);

在这里插入图片描述

遍历:

for(let [key, value] of kaimo[Symbol.iterator]) {
	console.log(key, value)
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凯小默

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值