生成器与迭代器的基础知识

103 阅读1分钟

- 生成器的基本知识

生成器在执行时并不会和普通函数一样执行函数内部的内容,生成器函数执行之后会返回一个迭代对象,该迭代对象内部有next()thorw()等方法,还有value等属性

  1. 函数名前加* 就是生成器函数
function* information() {
  console.log("hello!");
  yield "bilibili:ejm";
  console.log("hello world");
  yield "like:Attack on Titan";
}

//迭代对象,在开发者工具中看到其属性和方法
let ejm = information();
console.log("ejm", ejm);

//next方法迭代
ejm.next();
ejm.next();
ejm.next();
console.log(ejm.next()); //输出第三次迭代的结果
  1. yield关键字 空格后面要跟迭代的值,也可以跟另一个生成器函数

    此时函数体内依然遵循栈的特点

function* AboutHobby() {
  yield "bilibili:cartoon";
  yield* Other(); //另一个生成器
  yield "like:play game";
}

function* Other() {
  yield "bilibili官网:https://www.bilibili.com/";
}

for (let msg of AboutHobby()) {
  console.log(msg);
}
  1. 函数执行完成后,会处于非阻塞挂起的状态,直到下一次再用next()方法迭代

    因此普通函数内几乎不可能会使用的 while(true) 语句可以在生成器函数中出现

  2. 局部变量id仅能由生成器访问,如果要再创建一个迭代对象,也不会影响到前一个迭代对象的迭代

function* IDGenerator() {
  let id = 0;
  while (true) {
    yield ++id;
  }
}

const idIterator = IDGenerator();
const idIterator2 = IDGenerator();

let obj1 = { id: idIterator.next().value, msg: "bilibili:cartoon" };
let obj2 = { id: idIterator.next().value, msg: "like:play game" };
let obj3 = {
  id: idIterator.next().value,
  msg: "bilibili官网:https://www.bilibili.com/",
};
console.log(obj1);
console.log(obj2);
console.log(obj3);

以上内容来自于b站视频学习

www.bilibili.com/video/BV13q…