首页 > 其他分享 >ES6迭代器协议

ES6迭代器协议

时间:2024-08-30 13:26:31浏览次数:4  
标签:ES6 迭代 iterator 协议 对象 next done

迭代协议

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

 

作为ECMAScript2015的一组补充规范,迭代协议并不是新的内置实现或语法,而是协议。这些协议可以被任何遵循某些约定的对象来实现。

 

迭代协议具体分为两个协议:可迭代协议和迭代器协议

 

可迭代协议

可迭代协议允许JavaScript对象定义或定制它们的迭代行为,例如,在一个for...of结构中,哪些值可以被遍历到。一些内置类型同时是内置可迭代对象,并且有默认的迭代行为,比如Array或者Map,而其他内置类型则不是(比如Object)。

 

要成为可迭代对象,一个对象必须实现@@iterator方法。这意味着对象(或者它原型链上的某个对象)必须有一个键为@@iterator的属性,可通过常量Symbol.iterator访问该属性

属性
[Symbol.iterator] 返回一个符合迭代器协议的对象的无参数函数。

 

 

 

当一个对象需要被迭代的时候(比如被置入一个for...of循环时),首先,会不带参数调用它的@@iterator方法,然后使用此方法返回的迭代器要获得迭代的值。

 

值得注意的是调用此零个参数函数时,它将作为可迭代对象的方法进行调用。因此,在函数内部,this关键字可用于访问可迭代对象的属性,以决定在迭代过程中提供什么。

 

 

迭代器协议

迭代器协议定义了产生一系列值(无论是有限个还是无限个)的标准方式。当值为有限个时,所有的值都被迭代完毕后,则会返回一个默认值。

只有实现了一个拥有以下语义的next()方法,一个对象才能成为迭代器:

属性
next

一个无参数函数,返回一个应当拥有以下两个属性的对象:

done(boolean)

如果迭代器可以产生序列中的下一个值,则为false。(这等价于没有指定done这个属性)

如果迭代器已将序列迭代完毕,则为true.这种情况下,value是可选的,

 

value

迭代器返回的任何JavaScript值,done为true时可省略

 

next()方法必须返回一个对象,该对象应当有两个属性:done和value,如果返回了一个非对象值(比如false或undefined),则会抛出一个TypeError异常("iterator.next() returned a non-object value")

 

 

 

 

 

 

 

 

 

 

 

 

备注:不可能判断一个特定的对象是否实现了迭代器协议,然而,创造一个同时满足迭代器协议和可迭代协议的对象是很容易的

var myIterator = {
    next: function () {
        // ...
    },
    [Symbol.iterator]: function() { return this; };
}

 

使用迭代协议的例子

String是一个内置的可迭代对象

let someString = "Hi";
typeof someString[Symbol.iterator]; // "function"

String的默认迭代器会依次返回该字符串的各码点

let iterator = someString[Symbol.iterator]();
iterator + ""; // "[object String Iterator]"

iterator.next(); // { value: "h", done: false}
iterator.next(); // { value: "i", done: false}
iterator.next(); // { value: undefined, done: true}

一些内置的语法结构——比如展开语法——其内部实现也使用了同样的迭代协议:

[...someString] // ["h", "i"]

我们可以通过提供自己的@@iterator方法,重新定义迭代行为:

 

标签:ES6,迭代,iterator,协议,对象,next,done
From: https://www.cnblogs.com/cathy1024/p/13692850.html

相关文章

  • day15JS-es6的基础语法
     1.严格模式1.1严格模式的使用方法使用方法1:"usestrict";开启严格模式。使用方法2:<scripttype="moaule"></script> 当设置script标签为模块化时,自动启用严格模式。 1.2严格模式的限制1. 要求变量不能重名。//报错"usestrict";vara=2;vara=4; 2.......
  • HTTP协议入门
    HTTP协议入门参考:http://www.ruanyifeng.com/blog/2016/08/http.html      一、HTTP/0.9HTTP是基于TCP/IP协议的应用层协议。它不涉及数据包传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口。最早版本是1991年发布的0.9版。该版本及其简单,只有一个命......
  • 投屏协议
    AirPlay协议是苹果开发、广泛应用于iPhone、iPad和Mac设备,可以通过WiFi将iPhone、iPad等iOS设备上的图片、音频、视频通过无线的方式传输到支持AirPlay设备。即移动终端显示什么电视大屏就显示什么。随着AirPlay协议逐步普及,国内越来越多网络机顶盒,智能电视都集成了AirPlay协议。......
  • 快充协议方案 TYPE-C口取电支持PD5V、 9V、 12V、 15V、 20V
    Type-C口的充电器,一般是PD协议的充电器,例如华为65W,iPhone20W,小米45W充电器等等,这种充电器具有电压范围广,电流大,充电速度快等特点,一个充电器可以支持多种设备使用的优点。PD充电器的电压一般有5V、9V、12V、15V、20V,所有可以满足手机,ipad、平板和笔记本电脑使用,但是,这种充电器......
  • PD取电协议芯片 XSP08Q集成全协议芯片
    1:Type-C接口应用很广泛,几乎可以覆盖各行各业,例如快充领域,多种快充协议都可以在Type-C接口上实现,在用电端,只需要使用XSP08取电协议控制芯片,即可获取各种快充电压,例如:1、PowerDelivery(USB-PD)协议2、QC快充协议3、三星AFC快充协议4、华为快充协议等等2:在用电端的Type-C接口......
  • 快充协议方案——XSP04集成多种快充协议芯片
    快充协议芯片作为现代充电技术的核心组件,通过智能协商和动态调整电压电流,实现了快速、安全、高效的充电体验快充协议芯片的工作原理主要涉及识别充电设备、建立通信协议以及快速充电控制。这些芯片通过与充电设备的通信,识别出设备的充电需求和最大安全充电电流,然后根据这些信......
  • ES6两个数组进行比较
    在ES6中,可以使用扩展运算符...和Array.prototype.includes方法来比较两个数组,并找出它们的不同元素。constarray1=[1,2,3,4,5];constarray2=[3,4,5,6,7];//找出在array1中而不在array2中的元素constdiff1=array1.filter(item=>!array2.includes(item));//......
  • TCP/IP、UDP/IP协议
    参考链接1、OSI七层模型(1)OSI含义“OSI模型,即开放式通信系统互联参考模型(OpenSystemInterconnectionReferenceModel),是国际标准化组织(ISO)提出的一个试图使各种计算机在世界范围内互连为网络的标准框架,简称OSI。”(2)OSI定义了网络互连的七层模型(物理层、数据链路层、网络层......
  • 信息学奥赛初赛天天练-78-NOIP2015普及组-基础题3-中断、计算机病毒、文件传输协议FTP
    NOIP2015普及组基础题38所谓的“中断”是指()A操作系统随意停止一个程序的运行B当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的过程C因停机而停止一个程序的运行D电脑死机9计算机病毒是()A通过计算机传播的危害人体健康的一种......
  • 【待做】【网络协议系列+DNS安全】利用DNS隧道进行追踪和扫描
    一、什么是DNS隧道二、DNS隧道攻击典型步骤三、攻击者如何利用DNS隧道四、用于追踪的DNS隧道案例五、缓解措施原创二进制空间安全一、什么是DNS隧道DNS隧道是一种利用DNS协议进行数据传输的技术。在网络中,DNS通常用于将域名解析为对应的IP地址,但是它也可以被......