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. 批x网,登录加密(通过元素绑定的监听事件来找到加密函数)

    网站 base64加密 aHR0cHM6Ly93d3cucGlnYWkub3JnLw== 逆向分析 https://blog.csdn.net/a_123_4/article/details/1208 ...

  2. 2022-06-21:golang选择题,以下golang代码输出什么?A:3;B:4;C:100;D:编译失败。 package main import ( “fmt“ ) func

    2022-06-21:golang选择题,以下golang代码输出什么?A:3:B:4:C:100:D:编译失败. package main import ( "fmt" ) fu ...

  3. 2021-08-20:打砖块。有一个 m x n 的二元网格,其中 1 表示砖块,0 表示空白。砖块 稳定(不会掉落)的前提是:1.一块砖直接连接到网格的顶部,或者,2.至少有一块相邻(4 个方向之一

    2021-08-20:打砖块.有一个 m x n 的二元网格,其中 1 表示砖块,0 表示空白.砖块 稳定(不会掉落)的前提是:1.一块砖直接连接到网格的顶部,或者,2.至少有一块相邻(4 个方向之一 ...

  4. 沁恒 CH32V208(四): CH32V208 网络DHCP示例代码分析

    目录 沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置 沁恒 CH32V208(二): CH32V208的储存结构, 启动模式和时钟 沁恒 CH32V208 ...

  5. nodejs 入门基本概念

    nodejs 的诞生   Node.js 是2009的时候由大神 Ryan Dahl 开发的.Ryan 的本职工作是用 C++ 写服务器,后来他总结出一个经验,一个高性能服务器应该是满足"事 ...

  6. phpstudy-pikachu-字符型注入(get)

    在查询栏输入1,点击查询获得查询格式 ?name=1'&submit=查询 *捷径 ' or 1=1 --+ *非捷径 ?name=1' and 1=2 --+ 2--+&submit ...

  7. Go 语言 map 是并发安全的吗?

    原文链接: Go 语言 map 是并发安全的吗? Go 语言中的 map 是一个非常常用的数据结构,它允许我们快速地存储和检索键值对.然而,在并发场景下使用 map 时,还是有一些问题需要注意的. 本 ...

  8. Kubernetes GoRoutineMap工具包代码详解

    1.概述 GoRoutineMap 定义了一种类型,可以运行具有名称的 goroutine 并跟踪它们的状态.它防止创建具有相同名称的多个goroutine,并且在上一个具有该名称的 goroutin ...

  9. How to use the shell command to get the version of Linux Distributions All In One

    How to use the shell command to get the version of Linux Distributions All In One 如何使用 shell 命令获取 Li ...

  10. Nature 重大发现:癌基因竟不在染色体上?第一作者吴思涵亲身解读!

    编辑|李丽 记者|布德鸟 图片提供|吴思涵 今日凌晨,美国加州大学圣地亚哥分校 Ludwig 癌症研究所的 Paul Mischel 教授领导的研究团队发现, 大量的癌基因并不在染色体上,而是会从染色 ...