当前位置: 首页 > 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实现手写数字识别
  • 高级特效开发阶段学习总结
  • ES6指北【2】—— 箭头函数
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • Angular数据绑定机制
  • HTTP--网络协议分层,http历史(二)
  • IOS评论框不贴底(ios12新bug)
  • leetcode386. Lexicographical Numbers
  • Otto开发初探——微服务依赖管理新利器
  • React as a UI Runtime(五、列表)
  • Vue2 SSR 的优化之旅
  • Vue实战(四)登录/注册页的实现
  • 彻底搞懂浏览器Event-loop
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 动态规划入门(以爬楼梯为例)
  • 后端_MYSQL
  • 回顾2016
  • 检测对象或数组
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 数据可视化之 Sankey 桑基图的实现
  • 网页视频流m3u8/ts视频下载
  • 学习笔记:对象,原型和继承(1)
  • 一个SAP顾问在美国的这些年
  • 在Mac OS X上安装 Ruby运行环境
  • 终端用户监控:真实用户监控还是模拟监控?
  • Mac 上flink的安装与启动
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (二)springcloud实战之config配置中心
  • (二)丶RabbitMQ的六大核心
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (论文阅读11/100)Fast R-CNN
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (转)Sql Server 保留几位小数的两种做法