当前位置: 首页 > news >正文

(六) ES6 新特性 —— 迭代器(iterator)

CSDN话题挑战赛第2期
参赛话题:学习笔记

遍历器(Iterator)就是一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator 接口,就可以完成遍历操作

 1. ES6 创造了一种新的遍历命令 for...of 循环,Iterator 接口主要供 for...of 消费

 2. 原生具备 iterator 接口的数据(可用 for of 遍历 )

  • Array
  • Arguments
  • Set
  •  Map
  • String
  • TypedArray
  • NodeList

 3. 工作原理

a) 创建一个指针对象,指向当前数据结构的起始位置

b) 第一次调用对象的 next 方法,指针自动指向数据结构的第一个成员

c) 接下来不断调用 next 方法,指针一直往后移动,直到指向最后一个成员

d) 每调用 next 方法返回一个包含 value 和 done 属性的对象

注: 需要自定义遍历数据的时候,要想到迭代器。

iterator的使用:

声明一个数组

const xiyou = ['唐僧', '孙悟空', '猪八戒', '沙僧'];

如果我们想遍历它,可以使用 for...of 的方式

for(let v of xiyou){
    console.log(v);
}

✨for...of 与 for...in的区别

for...in是为遍历对象属性而构建的,它以任意顺序遍历一个对象的除Symbol以外的可枚举属性

在JavaScript中,数组也是对象的一种,所以数组也是可以使用for...in遍历

for...of语句在可迭代对象上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句(包括Array,Map,Set,String,TypedArray,arguments等等,不包括Object)

for...in 例子:

let obj = {
  name: 'aa',
  age: 18
}

对于遍历,我们还有另一种方式:使用迭代器

1. 创建一个指针对象,谁来创建?——>Symbol

  let iterator = xiyou[Symbol.iterator]();
  console.log(iterator);

得到的是一个迭代器对象,里面含有next方法。

2. 调用对象的next方法

  console.log(iterator.next());
  console.log(iterator.next());
  console.log(iterator.next());
  console.log(iterator.next());
  console.log(iterator.next());

我们可以发现: 

👉前四次调用iterator.next()都会一个返回数组中的元素value和一个done:false

👉 最后一次因为数组中没有元素了所以返回undefined以及一个done为真表示遍历已经完成了。

迭代器自定义遍历对象

当我们想要自定义遍历数组时,可以使用迭代器

假如我们想要拿到一个对象里面某个数组的数据:

<script>
  //声明一个对象
  const banji = {
    name: '终极一班',
    stus: ['xiaoming', 'xiaoning', 'xiaotian', 'knight']
  };

  //遍历这个对象
  for (let v of banji) {
    console.log(v);
  }
</script>

直接遍历对象明显是拿不到的,因为里面没有可用的iterator接口。所以我们可以在对象里面添加一个iterator方法:

<script>
  //声明一个对象
  const banji = {
    name: '终极一班',
    stus: ['xiaoming', 'xiaoning', 'xiaotian', 'knight'],
    // 实现iterator方法
    [Symbol.iterator]() {
      //索引变量
      let index = 0;
      //
      let _this = this;
      return {
        next: function () {
          if (index < _this.stus.length) {
            const result = { value: _this.stus[index], done: false };
            //下标自增
            index++;
            //返回结果
            return result;
          } else {
            return { value: undefined, done: true };
          }
        },
      };
    },
  };

  //遍历这个对象
  for (let v of banji) {
    console.log(v);
  }
</script>

这样就可以很轻松的拿到对象里的数组元素了。

相关文章:

  • 机器学习笔记-线性回归
  • Java线程同步的四种方式详解
  • Js的执行机制(异步)
  • 跨行转做产品经理岗位,怎么入门?
  • ssm基于Android系统的学习记录与提醒应用APP(ssm+uinapp+Mysql)
  • 微信小程序入门与实战之阅读列表与setData数据的绑定
  • springboot教室实验室预约系统在线视频点播系统毕业设计毕设作品开题报告开题答辩PPT
  • Go数据结构
  • Vue学习---插槽篇
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • Yii - [新]项目开发流程指南
  • 优秀的你在哪里?《阿里云SLS团队2023校园招聘》
  • 【图像分类】基于matlab多种特征结合支持向量机脑MRI肿瘤分类【含Matlab源码 2149期】
  • 06-使用pytorch实现手写数字识别
  • 高级特效开发阶段学习总结
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • @angular/forms 源码解析之双向绑定
  • CentOS 7 修改主机名
  • js
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • vue自定义指令实现v-tap插件
  • 反思总结然后整装待发
  • 分布式事物理论与实践
  • 猴子数据域名防封接口降低小说被封的风险
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 浏览器缓存机制分析
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #162 (Div. 2)
  • $.each()与$(selector).each()
  • (1)bark-ml
  • (10)STL算法之搜索(二) 二分查找
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (zhuan) 一些RL的文献(及笔记)
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (二)windows配置JDK环境
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (一) storm的集群安装与配置
  • (转)Unity3DUnity3D在android下调试
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .Net CF下精确的计时器
  • .NET Core 和 .NET Framework 中的 MEF2
  • .net refrector
  • .NET 事件模型教程(二)
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .考试倒计时43天!来提分啦!
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [ABC294Ex] K-Coloring
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured