热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ES6迭代协定

迭代协定可迭代协定(Theiterableprotocol)和迭代器协定(Theiteratorprotocol)是对ECMAScript2015的补充,不是新的内置或语法,仅仅是

迭代协定

可迭代协定(The iterable protocol) 和 迭代器协定(The iterator protocol)是对 ECMAScript 2015 的补充,不是新的内置或语法,仅仅是协定。能够被任何遵照某些商定的对象来完成。

可迭代协定

可迭代协定许可 Javascript 对象去定义或许定制它们的迭代行动。

一些内置范例是可迭代,比方 Array,TypeArray,Map,Set,String,在 for…of 构造中能够轮回遍历值,而 Object 就不是。

为了变成可迭代对象,一个对象必需完成 @@iterator 要领, 意义是这个对象(或许它原型链 prototype chain 上的某个对象)必需有一个名字是 Symbol.iterator 的属性:

PropertyValue
[Symbol.iterator]无参函数,该函数返回一个对象,该对象相符迭代器协定

迭代器协定

迭代器协定定义了一种规范的体式格局来发生有限或无穷序列的值

当一个对象完成了 next() 要领,而且相符以下定义,则该对象就是一个迭代器对象。

属性
next一个无参函数,返回一个对象,该对象具有两个属性 done 和 value

done(boolean)

  • 假如迭代器已到了迭代序列的末端,done 为 false
  • 假如迭代器还能够发生序列下一个值,done 为 true

value

迭代器返回的任何 Javascript 值,当 done 为 true,可疏忽。

next 要领必需是返回包括 done 和 value 属性的对象,假如非对象(类如 false, undefined)返回,将会抛出 TypeError

例子

可迭代协定例子

自定义一个可迭代对象

const iterableObj = {}
iterableObj[Symbol.iterator] = function* () {
yield 1
yield 2
yield 3
}
console.log([...iterableObj])

接收可迭代对象的内置 APIs

很多 APIs 接收可迭代对象作为参数,比方 Map([iterable]),WeakMap([iterable]),Set([iterable]),WeakSet([iterable])

const myObj = {}
new Map([[1, 'a'], [2, 'b'], [3, 'c']]).get(2) // "b"
new WeakMap([[{}, 'a'], [myObj, 'b'], [{}, 'c']]).get(myObj) // "b"
new Set([1, 2, 3]).has(3) // true
new Set('123').has('2') // true
new WeakSet(function* () {
yield {}
yield myObj
yield {}
}()).has(myObj) // true

用于可迭代对象的语法

一些语句或许表达式可用于可迭代对象,比方 for…of 轮回,spread operator,yield*,destructuring assignment。

// for...of
for (let i of [1, 2, 4]) {
console.log(i)
// 1
// 2
// 4
}
// spread operator
console.log([...'abc']) // ["a", "b", "c"]
// yield*
function* gen() {
yield* ['a', 'b', 'c']
}
console.log(gen().next()) // {value: "a", done: false}
// destructuring assignment
[a, b] = new Set(['a', 'b'])
console.log(a) // a

迭代器协定例子

简朴迭代器

function makeIterator(array) {
let nextIndex = 0
return {
next() {
return nextIndex }
}
}
const it = makeIterator(['a', 'b'])
console.log(it.next()) // {value: "a", done: false}
console.log(it.next()) // {value: "a", done: false}
console.log(it.next()) // {done: true}

生成器

function* makeSimpleGenerator(arr) {
let nextIndex = 0
while (nextIndex yield array[nextIndex++]
}
}
const it = makeSimpleGenerator(['a', 'b'])
console.log(it.next()) // {value: "a", done: false}
console.log(it.next()) // {value: "a", done: false}
console.log(it.next()) // {value: undefined, done: true}

ES6 class

class SimpleIterator {
constructor(data) {
this.data = data
this.index = 0
}
[Symbol.iterator]() {
return {
next: () => {
return this.index }
}
}
}
const simple = new SimpleIterator([1, 3, 9])
for (let i of simple){
console.log(i) // 1 3 9
}

再谈生成器 generator

从上面的示例能够看出,generator 是比较特别的,generator 既是一个 生成器对象,又是一个 可迭代对象!

const generatorObj = function* () {
yield 1
yield 2
yield 3
}()
console.log(typeof generatorObj.next) // function
console.log(typeof generatorObj[Symbol.iterator]) // function
console.log(generatorObj[Symbol.iterator]() === generatorObj) // true

文章如有马虎,迎接人人发问交换!

参考

  1. MDN: Iteration protocols

推荐阅读
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文介绍了如何在Mac上使用Pillow库加载不同于默认字体和大小的字体,并提供了一个简单的示例代码。通过该示例,读者可以了解如何在Python中使用Pillow库来写入不同字体的文本。同时,本文也解决了在Mac上使用Pillow库加载字体时可能遇到的问题。读者可以根据本文提供的示例代码,轻松实现在Mac上使用Pillow库加载不同字体的功能。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
author-avatar
手机用户新常态
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有