美文网首页
JS 迭代器

JS 迭代器

作者: zhuchangjin | 来源:发表于2023-08-09 12:03 被阅读0次

迭代器:迭代器(iterator),是使用户在容器对象(container,例如链表或数组)上可以遍历访问的对象,使用该接口无需关心容器对象的内部实现细节。

从迭代器的定义我们可以看出来,迭代器是帮助我们对  “某个数据结构进行遍历”  的对象。

在JavaScript中,迭代器也是一个具体的对象,这个对象需要符合迭代器协议(iterator protocol):

1.迭代器协议定义了产生一系列值(无论是有限还是无限个)的标准方式

2.在JavaScript中这个标准就是一个特定的next方法

next方法要求:next方法是一个无参数或者有一个参数的函数,返回结果应当拥有以下两个属性的对象:

1.done(boolean) : done返回一个布尔值: 可能是false, 可能是true

        ·如果迭代器可以产生序列中的下一个值,则为 false。(这等价于没有指定 done 这个属性。)

        ·如果迭代器已将序列迭代完毕,则为 true。这种情况下,value 是可选的,如果它依然存在,即这个值为迭代结束之后默认返回值。

2. value:value的返回值: 可能是一个具体的值, 可能是undefined

        ·迭代器返回的任何 JavaScript 值。done 为 true 时可省略

迭代器:

    1.迭代器是一个对象 首先我们创建一个对象

    2.迭代器中有一个next方法, 这个函数要求无参数或者仅有一个参数, 在对象中添加next方法

    3.next方法需要返回一个对象, 且对象中需要包含done和value两个属性

可迭代对象:当一个对象实现了iterable protocol协议时,它就是一个可迭代对象;

       1. 是必须实现 @@iterator (这是规范的名字) 方法,在代码中我们使用 [Symbol.iterator] (这是实际用的名字)访问该属性;

        2.这个[Symbol.iterator] 方法需要返回一个迭代器

class Person {  // 首先创建一个对象

  constructor(name, age, friends) {

    this.name = name

    this.age = age

    this.friends = friends

  }

  // 添加实例方法, 迭代协议

  [Symbol.iterator] () {

    let index = 0

    return {  // 必须返回迭代器

        // 将next方法改为箭头函数, 这样next方法中就不在绑定this, this回去上层作用域中寻找, 上层作用域中的this会指向info

      next: () => {

        if (index < this.friends.length) {

          return { done: false, value: this.friends[index++] }

        } else {

          return { done: true }

        }

      },

      // 添加一个return方法, 用于监听迭代中断, 当迭代器中断就会执行return方法

      return: () => {

        console.log("监听到迭代器中断")

        // 迭代器需要返回对象

        return { done:true }

      }

    }

  }

}

const p1 = new Person("kaisa", 18, ["aaa", "bbb", "ccc"])

for (item of p1) {

  console.log(item) // aaa bbb

  // 如果在某种情况写退出了循环, 我们需要告知迭代器

  if (item === "bbb") {

    break

  }

}

迭代器特性

1.可迭代对象可以使用展开语法普通对象不可使用展开语法:for …of、展开语法、yield*、解构赋值;

2.创建一些对象:new Map([Iterable])、new WeakMap([iterable])、new Set([iterable])、new WeakSet([iterable]);

3.方法调用:Promise.all(iterable)、Promise.race(iterable)、Array.from(iterable)

相关文章

  • 数组(Array)<迭代器>

    一、Js数组迭代器方法 主要介绍js数组中的forEach,every,some,filter,map迭代器方法 ...

  • python cookbook学习笔记04

    迭代器和生成器 文本迭代器 代理迭代 io数据操作 文件压缩gzip,bz2 获取相关文件目录 pickle,js...

  • js 中用迭代器模式优雅的处理递归问题

    什么是迭代器 循环数组或对象内每一项值,在 js 里原生已经提供了一个迭代器。 实现一个迭代器 实际应用 需求: ...

  • js迭代器iterator

    iterator(迭代)一般很少直接使用, 但是却是很常用很重要的功能.例如 :对象的扩展运算符(...)内部其实...

  • js红宝书笔记七 第七章 迭代器与生成器

    本文继续对JavaScript高级程序设计第四版 第七章 迭代器与生成器 进行学习 一、迭代器模式 在阅读js红宝...

  • js设计模式:迭代器

    1.内部迭代器模式 简单的来说就是forEach的实现 2.外部迭代器 用next迭代直到完成,通常由next, ...

  • js 迭代器与生成

    1 迭代器:循环时迭代器的基础,迭代器可以指定迭代的次数,以及每次迭代要执行什么操作。每次都会在下一次迭代之前完成...

  • 迭代器

    本节实验我们将为大家讲解迭代器,主要介绍 5 种常见迭代器:输入、输出迭代器,前向逆向迭代器,双向迭代器和随机迭代...

  • 迭代器与生成器

    迭代(iteration)与可迭代(iterable) 迭代器 迭代器协议(iterator protocol) ...

  • 10.迭代器与生成器

    一、迭代器 1). 迭代器概述 类比Java中的迭代器,参考迭代器模式https://www.jianshu.co...

网友评论

      本文标题:JS 迭代器

      本文链接:https://www.haomeiwen.com/subject/gzgopdtx.html