JavaScript迭代协议解读

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

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

可迭代协议

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

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

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

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

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

完成迭代

  1. a.set(1,1).set(2,2).set(3,3);
  2. console.log(a.entries());//[Map Entries] { [ 1, 1 ], [ 2, 2 ], [ 3, 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 接口的对象。

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

  1. class myIterator{
  2. constructor(limit){
  3. this.limit=limit;
  4. }
  5. [Symbol.iterator](){
  6. let count=1,limit=this.limit;
  7. return{
  8. next(){
  9. if(count<=limit){
  10. return {done:false,value:count++};
  11. }
  12. else{
  13. return {done:true,value:undefined};
  14. }
  15. }
  16. }
  17. }
  18. }
  19. let my_iterator=new myIterator(3);
  20. for(let i of my_iterator) console.log(i);
  21. /**
  22. * 1
  23. * 2
  24. * 3
  25. */

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

  1. const myIterator = {
  2. *[Symbol.iterator]() {
  3. yield 1;
  4. yield 2;
  5. yield 3;
  6. },
  7. };
  8. console.log([...myIterator]);
  9. function * idMaker(){
  10. let id = 0;
  11. while (true) {
  12. yield id++;
  13. }
  14. }
  15. const it = idMaker();
  16. 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. Grafana系列-统一展示-7-ElasticSearch数据源

    系列文章 Grafana 系列文章 ElasticSearch 数据源 Grafana内置了对Elasticsearch的支持.你可以进行多种类型的查询,以可视化存储在Elasticsearch中的日 ...

  2. 2013年蓝桥杯C/C++大学B组省赛真题(第39级台阶)

    题目描述: 小明刚刚看完电影<第39级台阶>,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级! 站在台阶前,他突然又想着一个问题: 如果我每一步只能迈上1个或2个台阶.先迈左脚,然 ...

  3. Linux(redhat)镜像

    作为一个合格的程序猿,Linux那就是必须得会玩哟呵,搜集了一些镜像分享大家,望笑纳. 云盘地址https://pan.baidu.com/s/1cB-llYI5RdRm9xJDmjFoWg 提取码 ...

  4. Windows常用的 CMD 命令合集

    常用的 CMD 命令合集: 基础命令 dir:列出当前目录中的文件和子目录. cd:更改当前目录.例如,cd Documents 将当前目录更改为 Documents 文件夹. md 或 mkdir: ...

  5. 我们的智能化应用是需要自动驾驶(Autopilot)还是副驾驶(Copilot)

    自动驾驶Autopilot 是一个知识密集且科技含量很高的技术,不基于点什么很难把它讲的相对清楚. 副驾驶 Copilot 是一种由 AI 提供支持的数字助理,旨在为用户提供针对一系列任务和活动的个性 ...

  6. drf多方式登录接口(手机号、邮箱、验证码)登录

    题目 ##### 3 多方式登录接口#### -使用auth的user表扩写 -用户名+密码 -手机号+密码 -邮箱+密码 -签发token逻辑,放在序列化类中写 方式一: serializer.py ...

  7. R 语言主成分分析(PCA)实战教程

    作者:落痕的寒假原文:https://blog.csdn.net/LuohenYJ/article/details/97950522 声明:本文章经原作者同意后授权转载. 主成分分析 Principa ...

  8. 在 RedHat 使用 gdc-client 下载 TCGA 数据

    今天,只聊一下 RedHat/CentOS 下 gdc-client 安装的那些事. gdc-client,官网地址:https://gdc.cancer.gov/access-data/gdc-da ...

  9. WWDC2023 Session系列:探索XCode15新特性

    一.版本说明 XCode 15 beta 发布于 2023 年 6月5日, 可支持 macOS 13.3 或以上版本, 你可以按需下载需要的平台. 二.新增特性 1.代码智能提示 (Code comp ...

  10. jenkins 发版获取镜像仓库中tag

    一.安装阿里云linux客户端工具 选择官网下载地址 # wget wget https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tg ...