当前位置: 首页 >  网技达人 >  行为型:迭代器模式

行为型:迭代器模式

导读:定义.迭代器模式提供一种方法按顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。迭代器模式是目的性极强的模式,它主要是用来解决遍历问题。.es6 中的迭代器.JS原生的集合类型数据结构,有Array(数组)和Object(对象),在ES6中,又新增了Map和Set。四

定义

迭代器模式提供一种方法按顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。迭代器模式是目的性极强的模式它主要是用来解决遍历问题。

es6 中的迭代器

JS原生的集合类型数据结构,有Array(数组)和Object(对象),在ES6中,又新增了Map和Set。四种数据结构各自有着自己的内部实现,但对于使用者,我们希望以同样的一套规则去遍历它们,所以ES6在推出新数据结构的同时也推出了一套统一的接口机制——迭代器(Iterator)

es6 中统一了迭代器迭代接口,任何数据结构只要具备**Symbol.iterator**属性(这个属性就是Iterator的具体实现,它本质上是当前数据结构默认的迭代器生成函数),就可以被**遍历**,确切的说是被for…of…循环和迭代器的next方法遍历,for…of…的背后正是对next方法的反复调用。

在ES6中,针对Array、Map、Set、String、TypedArray、函数的 arguments 对象、NodeList 对象这些原生的数据结构都可以通过for…of…进行遍历。

模拟实现迭代器

迭代就是不断的去拿下一个值的一个过程,以及遍历完的状态,是否完成遍历。

闭包写法

// 定义生成器函数,入参是任意集合
function iteratorGenerator(list) {
    // idx记录当前访问的索引
    let idx = 0
    // len记录传入集合的长度
    let len = list.length
    return {
        // 自定义next方法
        next: function() {
            // 如果索引还没有超出集合长度,done为false
            let done = idx >= len
            // 如果done为false,则可以继续取值
            let value = !done ? list[idx++] : undefined

            // 将当前值与遍历是否完毕(done)返回
            return {
                done: done,
                value: value
            }
        }
    }
}

let iterator = iteratorGenerator(['1号选手', '2号选手', '3号选手'])
iterator.next()
iterator.next()
iterator.next()

generator 写法

在es6 中**生成器函数** function * xxx 可以返回生成器对象( Generator 对象由生成器函数返回并且它符合可迭代协议和迭代器协议。)

生成器函数在执行时能暂停,后面又能从暂停处继续执行。

// 生成器函数写法
function* iteratorGenerator1(list) {
    yield '生成器函数,我是1号'
    yield '生成器函数,我是2号'
    yield '生成器函数,我是3号'
}

let iterator1 = iteratorGenerator1()
console.log(iterator1.next())
console.log(iterator1.next())
console.log(iterator1.next())

// 生成器函数写法--优化
function* iteratorGenerator2(list) {
    let index = 0, len = list.length;
    while (index <= len - 1) {

        yield list[index]
        index++
    }

}

let iterator2 = iteratorGenerator2(['生成器函数优化,我是1号', '生成器函数优化,我是2号', '生成器函数优化,我说3号'])
console.log(iterator2.next())
console.log(iterator2.next())
console.log(iterator2.next())

小结

可迭代协议:具备Symbol.iterator

迭代器协议:一个类似这个结构的对象:

{
	next: function () {
 	 return {
   		value: 'xx', // 当前遍历节点的值
   		done: false  // 是否完成遍历
    }
  }
}

参考迭代协议

https://developer.mozilla.org/zh- CN/docs/Web/JavaScript/Reference/Iteration_protocols

https://developer.mozilla.org/zh- CN/docs/Web/JavaScript/Reference/Statements/function*

上一篇:解释器模式(Interprete

下一篇:设计模式

内容
  • 最新消息,powershell,10多年的癌症被治好了!
    最新消息,powershell,
    2023-12-10
    问:癌症是指什么?.答:.powershell一直有个特性,它的管道会传递对象,请看:.‘abc’ | ForEach-
  • RocketMQ消费者是如何负载均衡的
    RocketMQ消费者是如何负载
    2023-12-09
    摘要:RocketMQ 支持两种消息模式:集群消费( Clustering )和广播消费( Broadcasting )
  • Three.js教程:对象克隆、复制
    Three.js教程:对象克隆、
    2023-12-08
    推荐:将 NSDT场景编辑器 加入你的3D工具链.其他系列工具: NSDT简石数字孪生.对象克隆.clone()和复制.
  • FlashDuty Changelog 2023-09-07 | 新增深色模式与主题配置
    FlashDuty Change
    2023-12-04
    FlashDuty:一站式告警响应平台,前往此地址免费体验!.FlashDuty.现在已经全面支持了深色模式,这为您提供
  • 休闲宽松T恤衫,释放自在舒适气息
    休闲宽松T恤衫,释放自在舒适气息
    2023-12-26
    休闲宽松T恤衫,释放自在舒适气息.在这个喧嚣的都市中,人们的生活节奏变得越来越快,压力也越来越大。因此,人们更加注重舒适
  • 商务休闲领带
    商务休闲领带
    2023-12-31
    商务休闲领带:展现不同的风格.商务休闲领带是男士着装中非常重要的一部分,它不仅可以完美搭配西装,展现出商务精英的睿智和稳
  • 时尚个性针织毛衣
    时尚个性针织毛衣
    2023-12-11
    时尚个性针织毛衣.时尚个性针织毛衣一直是秋冬季节的必备单品,不仅可以很好地保暖,还能展现出个性与时尚。无论是女性还是男性
  • 活泼儿童泳装,可爱**图案,防晒快干,让宝宝尽情享受水上乐趣
    活泼儿童泳装,可爱**图案,防晒
    2023-12-21
    活泼儿童泳装,让宝宝尽情享受水上乐趣.夏日即将来临,天气炎热,迎接夏天最好的方式莫过于在清凉的水中尽情玩耍了。对于小朋友
  • 轻盈雪纺衬衫,打造清新淑女形象
    轻盈雪纺衬衫,打造清新淑女形象
    2023-12-31
    轻盈雪纺衬衫,打造清新淑女形象.雪纺材质的衬衫一直以来都是清新淑女形象的代表,它轻盈飘逸的质地,柔软透气的触感,让人仿佛
  • 时尚皮质外套,展现酷帅摩登魅力
    时尚皮质外套,展现酷帅摩登魅力
    2024-01-05
    时尚皮质外套,展现酷帅摩登魅力.时尚和酷帅并不矛盾,皮质外套正是展现这种摩登魅力的最佳选择。无论是潮流的时尚圈还是街头的
  • 时尚修身连衣裙,展现优雅女性魅力
    时尚修身连衣裙,展现优雅女性魅力
    2023-12-06
    时尚修身连衣裙,展现优雅女性魅力.时尚修身连衣裙一直是女性衣橱里的必备单品,不仅款式多样,而且能够展现出女性的优雅魅力。
  • 萌娃配饰套装,包包、帽子、围巾等,增添宝宝的时尚气息
    萌娃配饰套装,包包、帽子、围巾等
    2024-01-20
    萌娃配饰套装,为宝宝增添时尚气息.宝宝是家庭的小太阳,****们都希望给他们最好的一切。随着时尚的发展,宝宝的时尚潮流也
  • 精致绣花针织衫,增添浪漫风情
    精致绣花针织衫,增添浪漫风情
    2023-12-01
    精致绣花针织衫,增添浪漫风情.如今,针织衫已成为时尚界不可或缺的一部分,而精致绣花针织衫更是备受追捧。其独特的设计和精湛
  • 时尚牛仔裤,展现随性休闲风格
    时尚牛仔裤,展现随性休闲风格
    2024-01-10
    时尚牛仔裤,展现随性休闲风格.时尚牛仔裤一直是时装界的宠儿,它不仅兼具舒适与时尚,更能展现出一种随性的休闲风格。无论是搭