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. 2022-11-13:以下go语言代码中,如何获取结构体列表以及结构体内的指针方法列表?以下代码应该返回{“S1“:[“M1“,“M2“],“S2“:[],“S3“:[“M1“,“M3“]},顺序不限

    2022-11-13:以下go语言代码中,如何获取结构体列表以及结构体内的指针方法列表?以下代码应该返回{"S1":["M1","M2"], ...

  2. 2022-07-01:某公司年会上,大家要玩一食发奖金游戏,一共有n个员工, 每个员工都有建设积分和捣乱积分, 他们需要排成一队,在队伍最前面的一定是老板,老板也有建设积分和捣乱积分, 排好队后,所有

    2022-07-01:某公司年会上,大家要玩一食发奖金游戏,一共有n个员工, 每个员工都有建设积分和捣乱积分, 他们需要排成一队,在队伍最前面的一定是老板,老板也有建设积分和捣乱积分, 排好队后,所有 ...

  3. vue-admin-template包下载地址

    https://gitee.com/panjiachen/vue-admin-template/ https://github.com/PanJiaChen/vue-admin-template

  4. es笔记四之中文分词插件安装与使用

    本文首发于公众号:Hunter后端 原文链接:es笔记四之中文分词插件安装与使用 前面我们介绍的操作及演示都是基于英语单词的分词,但我们大部分使用的肯定都是中文,所以如果需要使用分词的操作肯定也是需要 ...

  5. 2019年蓝桥杯C/C++大学B组省赛真题(数的分解)

    题目描述: 把2019分解成3个各不相同的正整数之和,并且要求每个正整数都不包含数字2和4,一共有多少种不同的分解方法? 注意交换3个整数的顺序被视为同一种方法,例如1000+1001+18 和100 ...

  6. Windows系统中,如何快速找到端口被占用的进程?

    在本地调试代码时,经常遇到端口被占用导致启动失败的问题,又不能很快找到哪个进程占用了端口,很是恼火. 今天,我们用shell命令轻松搞定. 一.打开命令提示符 window+R 组合键,调出命令窗口. ...

  7. flutter 的 in_app_web_view实现下载功能

    flutter与前端交互,利用in_app_web_view实现下载功能: 首先下载库,终端输入 flutter pub add flutter_inappwebview 之后导出 import 'p ...

  8. linux awk文本

    目录 一.awk概念 二.awk的工作过程 三.awk字符 四.内置变量 五.getline  六.awk的精准筛选 七.例子演示 八.实验演示 一.awk概念 1.概念:awk 是一个功能强大的编辑 ...

  9. Elasticsearch 6.x 配置search-guard 插件

    前言   es之前版本一直无用户验证功能,不过官方有提供一x-pack,但是问题是付费.在es的6.3.2版本中,已经集成了x-pack,虽然es团队已经对x-pack开源,但是在该版本中如果需要使用 ...

  10. ChatGPT小型平替之ChatGLM-6B本地化部署、接入本地知识库体验

    本文期望通过本地化部署一个基于LLM模型的应用,能让大家对构建一个完整的应用有一个基本认知.包括基本的软硬环境依赖.底层的LLM模型.中间的基础框架及最上层的展示组件,最终能达到在本地零编码体验的目的 ...