(基础)JavaScript迭代器[Symbol.iterator]

2023-10-30

迭代器就是为实现对不同集合进行统一遍历操作的一种机制,只要给需要遍历的数据结构部署Iterator接口,通过调用该接口,或者使用消耗该接口的API实现遍历操作。

迭代器 (iterator),是确使用户可在容器对象(container,例如链表或数组)上遍访的对象,使用该接口无需关心对象的内部实现细节。
        其行为像数据库中的光标,迭代器最早出现在1974年设计的CLU编程语言中;
在各种编程语言的实现中,迭代器的实现方式各不相同,但是基本都有迭代器,比如Java、Python等;
        从迭代器的定义我们可以看出来,迭代器是帮助我们对某个数据结构进行遍历的对象。
在JavaScript中,迭代器也是一个具体的对象,这个对象需要符合迭代器协议(iterator protocol):
        迭代器协议定义了产生一系列值(无论是有限还是无限个)的标准方式;
那么在js中这个标准就是一个特定的next方法;
next方法有如下的要求
        一个无参数或者一个参数的函数,返回一个应当拥有以下两个属性的对象:
done(boolean)
        如果迭代器可以产生序列中的下一个值,则为 false。(这等价于没有指定 done 这个属性。)
如果迭代器已将序列迭代完毕,则为 true。这种情况下,value 是可选的,如果它依然存在,即为迭代结束之后的默认返回值。
value
        迭代器返回的任何 JavaScript 值。done 为 true 时可省略。

实现迭代器函数

// 生成迭代器方法
function createArrayIterator(arr) {
  let index = 0
  return {
    next: function() {
      if (index < arr.length) {
        return { done: false, value: arr[index++] }
      } else {
        return { done: true, value: undefined } 
      }
    }
  }
}

const names = ["111", "222", "333"]
const namesIterator = createArrayIterator(names)
console.log(namesIterator.next())    
console.log(namesIterator.next())
console.log(namesIterator.next())

// 打印
// { done: false, value: '111' }
// { done: false, value: '222' }
// { done: false, value: '333' }

创建一个教室类,遍历教室学生

没有迭代器的

// 案例: 创建一个教室类, 创建出来的对象都是可迭代对象
class Classroom {
  constructor( students) {
    this.students = students
  }
  entry(newStudent) {
    this.students.push(newStudent)
  }
}

const classroom = new Classroom( ["学生1", "学生2", "学生3", "学生4", "学生5"])
classroom.entry("lilei")

for (const stu of classroom) {
  console.log(stu)
}


//报错classroom不是可迭代的
//for (const stu of classroom) {
                  ^

//TypeError: classroom is not iterable

自定义迭代器,可以遍历教室学生


// 案例: 创建一个教室类, 创建出来的对象都是可迭代对象
class Classroom {
  constructor( students) {
    this.students = students
  }
  entry(newStudent) {
    this.students.push(newStudent)
  }
  // 实现迭代器
  [Symbol.iterator]() {
    let index = 0
    return {
      next: () => {
        if (index < this.students.length) {
          return { done: false, value: this.students[index++] }
        } else {
          return { done: true, value: undefined }
        }
      },
      return: () => {    //监听迭代器停止
        console.log("迭代器提前终止了~")
        return { done: true, value: undefined }
      }
    }
  }
}

const classroom = new Classroom( ["学生1", "学生2", "学生3", "学生4", "学生5"])
classroom.entry("lilei")

for (const stu of classroom) {
  console.log(stu)
  if (stu === "学生4") break
}

// 打印
  // 学生1
  // 学生2
  // 学生3
  // 学生4
  // 迭代器提前终止了~

可迭代对象应用场景

  1. for of场景
  2. 数组展开语法 (对象展开 ES9(ES2018)中新增的一个特性: 用的不是迭代器)
  3. 解构语法  (对象结构 ES9(ES2018)中新增的一个特性: 用的不是迭代器)

数组是可迭代对象

const arr = [12,3,45,67,8]
for(let item of arr){
  console.log(item);
}
// 打印
// 12
// 3
// 45
// 67
// 8

对象不是可迭代对象

const obj = { name: "why", age: 18 }
for(let item of obj){
  console.log(item);
}

// 打印
// for(let item of obj){
//   ^
// TypeError: obj is not iterable

所以数组可以使用for...of ,对象不可以

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(基础)JavaScript迭代器[Symbol.iterator] 的相关文章

随机推荐

  • 【java】Static解读和public static void main(String[] args)详细分析

    首先问一个问题 public static void main String args 代码代表了什么含义 以及思考为什么java程序一开始就会进入main 函数 其实c c 也是如此 后面一个问题有static的基础就非常容易 后一个问题
  • Silverlight 1.1正式更名为Silverlight 2.0

    2007年11月30日 10 18 24 详情请参看下面两篇Blog http weblogs asp net scottgu archive 2007 11 29 net web product roadmap asp net silve
  • vscode快速生成标准的html代码

    Vsocde中 再新建html页面时 可以输入html 5然后按Tab或回车即可生成html模板 html 5
  • html5 webgl pyhon,WebGL基础

    WebGL坐标系 就像任何其他的3D系统 在WebGL中Z轴表示深x y和z轴 在WebGL的坐标被限制为 1 1 1 和 1 1 1 它意味着 如果你考虑该屏幕上投影的WebGL图形为立方体 则立方体的一个角将是 1 1 1 和相对的角为
  • PHPExcel导出

    PHPExcel导出 PHPExcel导出之前只做过简单的 这一次这个有些复杂的 包括单元格合并 字体的样式 边框线 单元格的背景色 单元格内容的自动换行 代码呈上 引入PHPExcel import Org Util PHPExcel i
  • 网络编程4——错误处理函数的封装和readn,readline封装思想说明

    系统调用不能保证每次都成功 必须进行出错处理 这样一方面可以保证程序逻辑正常 另一方面可以迅速得到故障信息 为使错误处理的代码不影响主程序的可读性 我们把与socket相关的一些系统函数加上错误处理代码包装成新的函数 叫做一个模块wrap
  • c++ 学习之 初始化列表初始化属性

    前言 我们来学习一下如何利用初始化列表来初始化属性 相较于我们所一般用的构造函数来初始化属性又有什么不同呢 正文 我们一般情况下是如何初始话属性的 先看代码 define CRT SECURE NO WARINGS using namesp
  • 多目标进化算法-约束问题的处理方法

    多目标进化算法系列 多目标进化算法 MOEA 概述 多目标优化 测试问题及其Pareto前沿 多目标进化算法详述 MOEA D与NSGA2优劣比较 多目标进化算法 约束问题的处理方法 基于C 的多目标进化算法平台MOEAPlat实现 MOE
  • Vue3 --父子组件生命周期

    渲染加载过程 mermaid svg cfIpXJJ2wAergAY1 label font family trebuchet ms verdana arial font family var mermaid font family fil
  • Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] ...

    警告的位置在matplotlib image中 从源码可知如果图像 np array 数值范围小于0或者大于1 或255 则会用np clip将其截断
  • Anaconda环境中pip命令找不到解决方案

    Anaconda环境中pip命令找不到解决方案 第一步 利用easy install安装pip easy install pip 参考链接 https www pythonheidong com blog article 406204 87
  • Spring AOP 自定义注解检查请求头(示例)

    代码传送门 需求 一个 Controller 可以处理 HTTP 请求 RestController public class DemoController GetMapping hello public String hello Requ
  • 配置nginx代理grafana实现域名访问

    目的 通过Nginx服务器对grafana进行代理 实现通过https 域名 grafana在公网进行访问 实践过程 1 修改Nginx配置 nginx conf 文件 添加访问grafana的配置 配置时注意proxy pass后面一定要
  • 微信JSSDK引入微信开发

    微信JS SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包 通过使用微信JS SDK 网页开发者可借助微信高效地使用拍照 选图 语音 位置等手机系统的能力 同时可以直接使用微信分享 扫一扫 卡券 支付等微信特有的能力 为微
  • 线性代数的本质——学习笔记

    线性代数的本质 学习笔记 该课程为b站上 3Blue1Brown大佬出的一系列线代视频 花了几天时间好好消化了一下 受益匪浅 欢迎各位没看懂视频的老哥过来看看我的理解 有什么错误也希望能指出 非常感谢 1 向量究竟是什么 向量的表示 建议
  • Google云数据库的“Enterprise“和“Enterprise Plus“版怎么选

    最近 Google Cloud SQL Google云上的RDS 做了一次大的产品调整与发布 将原来的Cloud SQL分为了两个版本 分别为 Enterprise 和 Enterprise Plus 版本 本文概述了两个版本的异同 以帮助
  • [UE4] UI部分

    UE4 UI部分 UMG基础 蓝图 几点思考 UMG和C 交互 UI基础控件和自定义控件 基础控件 自定义控件 3D UI UI适配 优化 UI开发示例 UI对话事件 SVN进行UE4项目协作 问题记录 UMG基础 虚幻示意图形界面设计器
  • HBuilderX低版本安装高版本组件库插件(HBuilderX 离线安装插件)

    背景 因为教学视频安装下来的HBuilderX版本低于现发行的 但是插件是最新版 想要使用到组件插件 特此记录方法步骤 windows 打开资源管理器 进入HBuilderX安装目录 进入plugins目录 将插件文件夹 放置到此目录 如是
  • Go_秒懂函数、参数、可变参数、匿名函数、内置函数

    函数是将具有独立功能的代码块组成一个整体 使其具有特殊功能的代码集 它将复杂的算法过程分解为若干个小任务 使程序结构更加清晰 易于维护 通过调用完成一段算法指令 输出或存储相关结果 因此 函数还是代码复用和测试的基本单元 关键字func用于
  • (基础)JavaScript迭代器[Symbol.iterator]

    迭代器就是为实现对不同集合进行统一遍历操作的一种机制 只要给需要遍历的数据结构部署Iterator接口 通过调用该接口 或者使用消耗该接口的API实现遍历操作 迭代器 iterator 是确使用户可在容器对象 container 例如链表或