# JavaScript 生成器
# 课程目标
- 学习生成器基础知识,掌握生成器应用场景。
- 掌握生成器基本应用方法
# 阅读
生成器是 ES6 新增的一个极为灵活的结构,拥有在一个函数块内暂停和恢复代码执行的能,生成器可以自定义迭代器和实现携程
- 生成器函数 | MDN (opens new window)
- JavaScript 生成器简介:初学者指南 (opens new window)
- Generators | JavaScript 现代教程 (opens new window)
- 生成器 | You-Dont-Know-JS-Es6 (opens new window)
- 生成器深入学习指南 (opens new window)
- 深入了解 ES6 生成器 (opens new window)
- Generator 函数的语法 (opens new window)
# 任务一
请你利用生成器实现一个随机数字序列生成器。
- 可以指定随机数字的生成范围(默认是 0-10)
- 可以指定这一组随机数字序列的个数(默认生成 5 个数字)
/**
* @description 随机生成数字序列生成器函数
* @method *isIcreateRandomGeneratorterable
* @param {number}start 生成数字的范围下限
* @param {number}end 生成数字的范围上限
* @param {number}num 生成数字的个数
**/
function* createRandomGenerator(start = 0, end = 10, num = 5) {
// your code here
}
// 测试用例
let randowSequence = createRandomGenerator(0, 20, 10); //调用生成器,随机生成范围是1-20的10个数字
let randowSequence2 = createRandomGenerator(10, 100, 50); //调用生成器,随机生成范围是10-100的5个数字
for (let number1 of randowSequence) {
console.log(number1);
}
//打印出10个范围为1-20的数字
for (let number2 of randowSequence2) {
console.log(number2);
}
//打印出5个范围为10-100的数字
# 任务二
请你运用生成器实现二叉树遍历
- 因为这一节主要学习生成器,所以为了大家能够快速练习我们给出了二叉树的构造函数,有时间的同学可以自己实现二叉树的实现
- 为二叉树部署 Iterator 接口,实现一个键名为 Symbol.iterator 的方法,使二叉树也变为可迭代对象,并且该方法是一个生成器方法,并在调用时返回一个迭代器
- 遍历顺序不做要求,有精力的同学可以使用先序,中序,后序都实现一次
- 要求可以使用 let...of 迭代二叉树对象实例,打印出每一个二叉树节点
class BinaryTree {
constructor(value, left = null, right = null) {
this.value = value;
this.left = left;
this.right = right;
}
/** Prefix iteration */
*[Symbol.iterator]() {
// your cod here
}
}
//测试用例
//以下代码创建一个二叉树
const tree = new BinaryTree(
"a",
new BinaryTree("b", new BinaryTree("c"), new BinaryTree("d")),
new BinaryTree("e")
);
//并通过for-of对二叉树进行迭代:
for (const x of tree) {
console.log(x);
}
// Output:
// a
// b
// c
// d
// e
# 自测问题
- 标识生成器的 * 号会受到两侧空格影响吗?
- 生成器是什么?应用场景有哪些?
- 下面的函数会在控制台打印
执行生成器函数
吗?
function* generatorFn() {
console.log("执行生成器函数");
yield 1;
}
const g = generatorFn();
- 请判断控制台将打印出什么?
function* genr() {
console.log(yield);
console.log(yield);
}
let g = genr();
g.next("Start");
g.next("Step 1");
g.next("Step 2");