JavaScript迭代协议解读

迭代协议分为可迭代协议迭代器协议

协议指约定俗成的一系列规则。

可迭代协议

可迭代协议规定了怎么样算是一个可迭代对象:可迭代对象或其原型链上必须有一个键为[Symbol.iterator]的属性。

一些内置类型如Array和Map均是可迭代对象,而Object不是。

let a = new Map();
let b = Object();
console.log(Symbol.iterator in a);//true
console.log(Symbol.iterator in b);//false

Symbol.iterator是一个无参函数,查看可迭代对象的原型链([[Prototype]])可知,它指向了entris(),调用它将返回一个符合迭代器协议迭代器对象

console.log(a[Symbol.iterator]);//[Function:entries]

完成迭代

a.set(1,1).set(2,2).set(3,3);
console.log(a.entries());//[Map Entries] { [ 1, 1 ], [ 2, 2 ], [ 3, 3 ] }
console.log(...a);//[ 1, 1 ] [ 2, 2 ] [ 3, 3 ]

迭代器协议

迭代器是按需创建的一次性接口对象,每个迭代器都会关联一个可迭代对象。

迭代器协议规定:实现了Iterabor接口的同时定义了一个next()方法的对象为一个迭代器。

迭代器具有三个方法:next()、return()和throw()。后两个是可选的。

  • next():无参数或者接受一个参数,并返回一个符合 IteraborResult 接口的对象。

    IteraborResult有两个属性:

    • done:为true时,迭代终结;为false时,迭代继续。
    • value:value作为返回值返回,done为true时忽略。
  • return(value):无参数或者接受一个参数,执行必要的清理工作(例如关闭数据库连接),并返回一个符合 IteraborResult 接口的对象,通常返回的value等于传进来的arguments.value,而done为true。
  • throw():无参数或者接受一个参数的函数,并返回符合 IteratorResult 接口的对象。

接下来,手动使用类实现一个迭代器:

class myIterator{
constructor(limit){
this.limit=limit;
}
[Symbol.iterator](){
let count=1,limit=this.limit;
return{
next(){
if(count<=limit){
return {done:false,value:count++};
}
else{
return {done:true,value:undefined};
}
}
}
}
}
let my_iterator=new myIterator(3);
for(let i of my_iterator) console.log(i);
/**
* 1
* 2
* 3
*/

或者用生成器实现迭代器:

const myIterator = {
*[Symbol.iterator]() {
yield 1;
yield 2;
yield 3;
},
};
console.log([...myIterator]); function * idMaker(){
let id = 0;
while (true) {
yield id++;
}
}
const it = idMaker();
console.log(it.next().value);//0

异步迭代器和异步可迭代协议

语言与可迭代协议之间的交互

JavaScript迭代协议的更多相关文章

  1. ECMAScript 2015 可迭代协议:迭代普通对象

    可迭代协议允许 JavaScript 对象去定义或定制它们的迭代行为, 例如(定义)在一个 for..of结构中什么值可以被循环(得到). 一些内置类型都是内置的可迭代类型并且有默认的迭代行为( 比如 ...

  2. javascript 伪协议

    [javascript 伪协议] 将javascript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中.这个特殊的协议类型声明了URL的主体是任意的javascrip ...

  3. A标签使用javascript:伪协议

    一.前言 今天,遇到一个别人挖的坑,问题是这样的. 做了一个列表页,可以筛选数据,有很多筛条件.主要是有input复选框和<a>标签两种.如图: 其中房价的筛选条件使用<a>标 ...

  4. python - 迭代器(迭代协议/可迭代对象)

    迭代器 # 迭代器协议 # 迭代协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就触发一个 StopIteration 异常,以终止迭代(只能往后走不能往前退) # 可迭代对 ...

  5. 【javascript 伪协议】小结

    [javascript 伪协议] 将javascript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中.这个特殊的协议类型声明了URL的主体是任意的javascrip ...

  6. JS - 迭代协议

    Iteration protocols | MDN 可迭代协议(iterable protocol) 迭代器协议(iterator protocol)

  7. javascript——迭代方法

    <script type="text/javascript"> //五个迭代方法 都接受两个参数:要在每一项上运行的函数 和 运行该函数的作用域(可选) //every ...

  8. javascript 迭代与递归

    <script type="text/javascript"> // //原生js // window.onload = function(){ // var btn ...

  9. 大哥带的JavaScript伪协议

    将javascript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中.这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的 ...

  10. JavaScript迭代

    定义: 指的是按照某种顺序逐个访问列表中的每一项. 迭代在数学中的定义: 在循环的基础上, 每一次循环, 都比上一次更为接近结果. 循环定义:指的是在满足条件的情况下,重复执行同一段代码. 迭代方法: ...

随机推荐

  1. 2023-03-24:音视频mp3和h264混合(muxer)编码为mp4,用go语言编写。

    2023-03-24:音视频mp3和h264混合(muxer)编码为mp4,用go语言编写. 答案2023-03-24: 这是一个使用FFmpeg库将MP3和H.264混合编码为MP4的Go语言程序. ...

  2. 2022-09-30:以下go语言代码输出什么?A: true true false true false; B: true false false true false; C: true true

    2022-09-30:以下go语言代码输出什么?A: true true false true false: B: true false false true false: C: true true ...

  3. 2021-08-01:如果只给定一个二叉树前序遍历数组pre和中序遍历数组in,能否不重建树,而直接生成这个二叉树的后序数组并返回。已知二叉树中没有重复值。

    2021-08-01:如果只给定一个二叉树前序遍历数组pre和中序遍历数组in,能否不重建树,而直接生成这个二叉树的后序数组并返回.已知二叉树中没有重复值. 福大大 答案2021-08-01: 先序遍 ...

  4. 2021-10-07:将有序数组转换为二叉搜索树。给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树

    2021-10-07:将有序数组转换为二叉搜索树.给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树.高度平衡 二叉树是一棵满足「每个节点的左右两个子树 ...

  5. [ABC270F] Transportation

    [ABC270F] Transportation 题意 有 \(n\) 个点,有 \(m\) 条可以加上的边,如果两个点同时建立了一种东西,那么也算连了一条边,每条边都有个代价,每个点建一个东西也有不 ...

  6. Dashboard监控页面和Zuul路由网关

    Dashboard监控页面 dashboard监控功能:我们需要前端页面能够监控提供者provider8001的工作状态 对dashboard监控页面的介绍: 1.在客户端导依赖 <?xml v ...

  7. remote: HTTP Basic:Access denied fatal:Authentication failed for

    近来在一天新电脑上面使用git pull 一个项目,老是提示 Access denied, 找了许多方法,ssh key这些都配置了还是不行,当时别提有多尬 看嘛这就是pull 时的提示 // *** ...

  8. 你是怎么学习 Java 技术的?

    一.Java 语言 Java 语言不只是一门语言. Java 学习不是一蹴而就就可以达成的,它是一个循序渐进,由浅入深,由表及里的过程.尤其需要注意的是不能有浅尝辄耻,不求甚解的态度.每个地方只抓一点 ...

  9. 使用默认pypi源出现连接超时

    背景信息 安装 dataworks sdk 时报错,原因是连接默认的 pypi 仓库超时 pip install aliyun-python-sdk-dataworks-public==4.2.1 报 ...

  10. 一分钟学一个 Linux 命令 - find 和 grep

    前言 大家好,我是 god23bin.欢迎来到<一分钟学一个 Linux 命令>系列,每天只需一分钟,记住一个 Linux 命令不成问题.今天需要你花两分钟时间来学习下,因为今天要介绍的是 ...