深入JavaScript Day22 - 迭代器、可迭代对象、iterator、iterable、生成器、generator、生成器函数

一、迭代器、可迭代对象

1、【重要】一句话概括什么是迭代器?迭代器模式的优点是什么?

  • 【迭代器】是帮助我们对某个数据结构进行遍历的对象
  • 【注意点】迭代器是对象
  • 【迭代器模式】让我们无须关心数据结构的内部实现,就可以进行遍历
image.png

2、手写一个最简单的迭代器对象,理解迭代器对象?

let names = ["aaa", "bbb", "ccc"];

let index = 0;
let namesIterator = {
  next: function () {
    if (index < names.length) {
      return { done: false, value: names[index++] };
    } else {
      return { done: true, value: undefined };
    }
  },
};

console.log(namesIterator.next());
console.log(namesIterator.next());
console.log(namesIterator.next());
console.log(namesIterator.next());

3、【迭代器】和【可迭代对象】之间是什么关系(一句话概括)?

  • 当一个对象实现了iterable protocol,也就是内部 Symbol.iterator 属性 返回一个迭代器,那么该对象就是可迭代对象。
image.png

4、手写可迭代对象?

  • 有时间,还是得再写一次,这次写得很艰难
const obj = {
  names: ["aaa", "bbb", "ccc"],
  [Symbol.iterator]: function () {
    let index = 0;
    return {
      next: () => {
        if (index < this.names.length) {
          return { done: false, value: this.names[index++] };
        } else {
          return { done: true, value: undefined };
        }
      },
    };
  },
};
const iterator = obj[Symbol.iterator]();
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());

image.png

5、为什么一个普通的const obj = {names: ["aaa", "bbb", "ccc"]}对象,无法调用for...of语法?

  • 因为 for...of 语法仅仅适合iterable对象,而obj不是一个iterable对象。
// 会有如下报错
for (const item of obj) {
                             ^
TypeError: obj is not iterable
  • 但是如果我们使用上题中实现【iterable protocol】的obj就可以使用 for...of 语法

二、生成器

1、什么是生成器(generator,一句话概括)?生成器和迭代器有关系吗?

  • 【生成器】生成器是ES6中新增的一种函数控制、使用的方案,它可以让我们更加灵活的控制【函数什么时候继续执行、暂停执行】。
  • 【关系】生成器是一种特殊的迭代器。

2、【学习技巧】凡是遇到【新知识】,被定义成【旧知识】的特殊情况,我们该怎么学习【新知识】呢?

  • 【首先】把旧知识的概念复习一下,然后套在新知识上实践一遍
  • 【其次】找出新知识相对旧知识的特殊之处。

3、生成器和生成器函数有什么关系?如何定义一个生成器函数?

  • 生成器函数的返回值是一个Generator(生成器)
image.png

4、yield* 是什么作用?

  • 【作用】可以将一个数组,快速转换成生成器遍历代码
  • 【技巧】用生成器替代迭代器,代码通常会更加简洁
class Room {
  constructor(address, students) {
    this.students = students;
    this.address = address;
  }
  foo = function () {
    console.log("foo");
  };

  [Symbol.iterator] = function* () {
    yield* this.students;
  };
}

const room2 = new Room("逸夫楼", ["zhansan", "lisi", "wangwu"]);

for (const stu of room2) {
  console.log(stu);
}

5、一个能传参、能拿返回值、能分段执行的生成器函数?

function* foo(prama1) {
  console.log("foo函数第一段");
  let value1 = 100;
  const prama2 = yield value1 + prama1;

  console.log("foo函数第二段");
  let value2 = 200;
  const prama3 = yield value2 + prama2;

  console.log("foo函数第三段");
  let value3 = 300;
  const prama4 = yield value3 + prama3;

  console.log("foo函数第四段");
  let value4 = 400 + prama4;
  return value4;
}

const generator = foo(10);

console.log(generator.next());
console.log(generator.next(20));
console.log(generator.next(30));
console.log(generator.next(40));
console.log(generator.next(50));
  • 【输出结果】
foo函数第一段
{ value: 110, done: false }
foo函数第二段
{ value: 220, done: false }
foo函数第三段
{ value: 330, done: false }
foo函数第四段
{ value: 440, done: true }
{ value: undefined, done: true }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容