加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

ES6+ 迭代协议运用

发布时间:2023-03-27 13:57:05 所属栏目:教程 来源:
导读:迭代协议包括两方面的内容 —— 可迭代协议和迭代器协议,下面我们就来看看这两个协议都是什么。

什么是可迭代协议?可以通过 JavaScript 对象定义或定制迭代行为,在 JavaScript 中有一些内置类型并且
迭代协议包括两方面的内容 —— 可迭代协议和迭代器协议,下面我们就来看看这两个协议都是什么。

什么是可迭代协议?可以通过 JavaScript 对象定义或定制迭代行为,在 JavaScript 中有一些内置类型并且满足内置的可迭代对象,具有迭代的行为。如 Array、Map、Set 等。还有一个比如字面量对象(Object)则没有,如果要对 Object 进行迭代的话需要使用 for...in 循环,但是 for...in 在循环时需要判断是否是自身属性。所以很多时候如果想用 for...of 进行迭代时就需要使用对象上的 Object.keys() 等方法提取对象中的 keys 后再去进行遍历操作。

在 ES6 中可迭代协议规定想要成为可迭代对象,这个对象必须实现 @@iterator 方法。这意味着对象(或者它原型链上的某个对象)必须有一个键为 @@iterator 的属性,可通过常量 Symbol.iterator 访问该属性。所以,一个对象满足可迭代协议的关键在于实现 Symbol.iterator 方法,这个方法的返回值是一个符合迭代器协议的对象,并且是一个无参数的函数。

上面说到了在实现 Symbol.iterator 方法时需要返回一个满足迭代器协议的方法。那么迭代器协议又是什么呢?

迭代器协议定义了产生一系列值的一个标准方式,迭起协议规定需要返回一个带 next() 方法的对象。 next() 可以被多次执行,每次执行都会返回一个对象,该对象包含两个属性,done 和 value:

done 是一个 boolean,在没有迭代完时返回 false,迭代完成后返回 true;
value 就是被迭代的返回值,当 done 为 true 时可以省略。
实现了以上两点才会满足一个迭代器协议。一般来说可迭代协议和迭代器协议在实际的场景中是同时存在的。下面我来看看什么是迭代器?并且怎么使用可迭代协议和迭代协议去实现一个迭代器。

这里说的迭代器是遵循上面两个协议来实现的,在满足两个协议时,我们可以显式地通过不断调用 next () 方法去进行迭代。在迭代一个迭代器后,我们称之为消耗了这个迭代器而,且每个迭代器只能执行一次。下面我们来看看怎么实现一个迭代器:

var obj = {}
obj[Symbol.iterator] = function() {
  let index = ;
  return {
    next() {
      if (index <= ) {
        return {value: index++, done: false}
      } else {
        return {done: true}
      }
    }
  }
}
上面的代码中根据可迭代协议给 obj 对象添加一个 Symbol.iterator 方法,再根据迭代器协议返回一个 next() 方法,在每次消耗 next() 时对 index 进行加 1 操作。当 index 大于 10 的时候结束迭代行为,之后再消耗 next() 返回值不变。

根据上面的代码,我们可以显式的手动调用 next():

var iterator = obj[Symbol.iterator]();
var s = iterator.next();
while(!s.done) {
  console.log(s.value);
  s = iterator.next();
}
// 1
// 2
// ...
执行上面的代码,在浏览器的控制台中,可以看到大于的结果是 1 到 10。上面是我们手动执行消耗 next() 的方式,上面我们也说了,只要满足迭代协议就可以被 for...of 循环,那是不是真的是这样的呢?下面我们就使用 for...of 对 obj 进行循环。

for (let i of obj) {
  console.log(i)
}
// 1
// 2
// ...
在控制台中执行上面的代码,可以看到和我们使用手动调用 next() 方式返回打印的结果是一样的。

本节我们主要学习了两个协议 —— 可迭代协议和迭代器协议,并且通过这两个协议实现了一个迭代器。通过这个迭代器我们知道,在满足这两个协议后就可以使用 for...of 进行循环,并且我们进行显示调用进行了验证。

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章