JS 迭代器

2023-08-09  本文已影响0人  zhuchangjin

迭代器:迭代器(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)

上一篇下一篇

猜你喜欢

热点阅读