美文网首页
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)

    相关文章

      网友评论

          本文标题:JS 迭代器

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