# JavaScript 生成器

# 课程目标

  • 学习生成器基础知识,掌握生成器应用场景。
  • 掌握生成器基本应用方法

# 阅读

生成器是 ES6 新增的一个极为灵活的结构,拥有在一个函数块内暂停和恢复代码执行的能,生成器可以自定义迭代器和实现携程

# 任务一

请你利用生成器实现一个随机数字序列生成器。

  • 可以指定随机数字的生成范围(默认是 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");