ES6学习笔记13 Iterator 和 for...of 循环

【ES6系列】Iterator,CSS的行内样式与内联样式 next()valuedonevaluedone以Set为例:next()如果期望直接获取到具体的值,那么就需要通过上面提到的for...of来实现了。示例:当使用for...of循环遍历某种数据结构时,该循环会自动去寻找Iterator接口。一种数据结构只要部署了Iterator接口,那么就称这种数据结构是可遍历的(iterableES6规定,Iterator,也就是说,一种数据结构只要有属性,那么就可以被认为是可遍历的。在ES6中,有些数据结构原生就具备这个属性,即不用任何处理就可以被。 阅读详情

Iterator接口简介

遍历器(Iterator)是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator 接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。遍历器接口可供for...of使用,循环遍历某种数据结构

Iterator 的遍历过程:

(1)创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。

(2)第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。

(3)第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。

(4)不断调用指针对象的next方法,直到它指向数据结构的结束位置。

每一次调用next方法,都会返回数据结构的当前成员的信息。具体来说,就是返回一个包含value和done两个属性的对象。其中,value属性是当前成员的值,done属性是一个布尔值,表示遍历是否结束。

下面是模拟next方法返回值的例子

var it = makeIterator(['a', 'b']);

it.next() // { value: "a", done: false }
it.next() // { value: "b", done: false }
it.next() // { value: undefined, done: true }

function makeIterator(array) {
  var nextIndex = 0;
  return {                 //返回一个具有next方法的遍历器对象
    next: function() {  
      return nextIndex < array.length ?
        {value: array[nextIndex++], done: false} :
        {value: undefined, done: true};
    }
  };
}

ES6 规定,默认的 Iterator 接口部署在数据结构的Symbol.iterator属性,或者说,一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”(iterable)。

Symbol.iterator属性本身是一个函数,就是当前数据结构默认的遍历器生成函数。执行这个函数,就会返回一个遍历器。至于属性名Symbol.iterator,它是一个表达式,返回Symbol对象的iterator属性,这是一个预定义好的、类型为 Symbol 的特殊值,所以要放在方括号内

const obj = {
  [Symbol.iterator] : function () {
    return {
      next: function () {
        return {
          value: 1,
          done: true
        };
      }
    };
  }
};

原生具备了Iterator接口的数据结构有:Array,Map,Set,String,TypedArray,arguments对象,NodeList对象。除此之外,其他数据结构的Iterator接口都需要自己在Symbol.iterator属性上面部署(或原型链上的对象具有该方法也可),这样才会被for…of循环遍历

下面是通过遍历器实现指针结构的例子

function Obj(value) {
  this.value = value;
  this.next = null;    //用于指向下一个对象
}

Obj.prototype[Symbol.iterator] = function() {   //在原型对象上部署遍历器接口
  var iterator = { next: next };     //遍历器为一个包含next方法的对象

  var current = this;     //指向当前对象

  function next() {
    if (current) {      //如果当前对象存在,则返回值,并指向下一个对象
      var value = current.value;    
      current = current.next;
      return { done: false, value: value };
    } else {
      return { done: true };
    }
  }
  return iterator;
}

var one = new Obj(1);
var two = new Obj(2);
var three = new Obj(3);

one.next = two;
two.next = three;

for (var i of one){
  console.log(i); // 1, 2, 3
}

下面为对象部署Iterator接口

let obj = {
  data: [ 'hello', 'world' ],
  [Symbol.iterator]() {
    const self = this;
    let index = 0;
    return {
      next() {
        if (index < self.data.length) {
          return {
            value: self.data[index++],
            done: false
          };
        } else {
          return { value: undefined, done: true };
        }
      }
    };
  }
};

如果Symbol.iterator方法对应的不是遍历器生成函数(即会返回一个遍历器对象),解释引擎将会报错。有了遍历器接口,数据结构就可以用for...of循环遍历

Symbol.iterator方法的最简单实现,还是使用 Generator 函数。

let myIterable = {
  [Symbol.iterator]: function* () {
    yield 1;
    yield 2;
    yield 3;
  }
}
[...myIterable] // [1, 2, 3]

// 或者采用下面的简洁写法

let obj = {
  * [Symbol.iterator]() {
    yield 'hello';
    yield 'world';
  }
};

for (let x of obj) {
  console.log(x);
}
// "hello"
// "world"

调用Iterator接口的场合

(1)解构赋值
对数组和 Set 结构进行解构赋值时,会默认调用Symbol.iterator方法。

(2)扩展运算符
扩展运算符(…)也会调用默认的 Iterator 接口,可以将任何部署了 Iterator 接口的数据结构,转为数组。

(3)yield*
yield*后面跟的是一个可遍历的结构,它会调用该结构的遍历器接口

let generator = function* () {
  yield 1;
  yield* [2,3,4];
  yield 5;
};

var iterator = generator();

iterator.next() // { value: 1, done: false }
iterator.next() // { value: 2, done: false }
iterator.next() // { value: 3, done: false }
iterator.next() // { value: 4, done: false }
iterator.next() // { value: 5, done: false }
iterator.next() // { value: undefined, done: true }

(4)任何接受数组作为参数的场合

for...of
Array.from()
Map(), Set(), WeakMap(), WeakSet()(比如new Map([['a',1],['b',2]]))
Promise.all()
Promise.race()

遍历器对象的 return() 和 throw()

遍历器对象除了具有next方法,还可以具有return方法和throw方法。在自己部署的遍历器对象生成函数中,next方法是必须,而return方法和throw方法是可选的

return方法的使用场合是,如果for...of循环提前退出(通常是因为出错,或者有break语句),就会调用return方法。如果一个对象在完成遍历前,需要清理或释放资源,就可以部署return方法。

function readLinesSync(file) {
  return {
    [Symbol.iterator]() {
      return {
        next() {
          return { done: false };
        },
        return() {   //关闭文件
          file.close();
          return { done: true };
        }
      };
    },
  };
}

return方法必须返回一个对象,这是 Generator 规格决定的。

遍历器的throw方法用于抛出错误,主要配合 Generator 函数内部捕获错误来使用,一般遍历器对象用不到这个方法

for…of 循环

for...of循环可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象(比如arguments对象、DOM NodeList 对象)、后文的 Generator 对象,以及字符串等任何部署了Symbol.iterator属性的数据结构。

还可以使用其遍历计算生成的数据结构,例如keys(),values(),entries()

let arr = ['a', 'b', 'c'];
for (let pair of arr.entries()) {
  console.log(pair);
}
// [0, 'a']
// [1, 'b']
// [2, 'c']

for...of循环还有一个特点,就是会正确识别 32 位 UTF-16 字符。

for (let x of 'a\uD83D\uDC0A') {
  console.log(x);
}
// 'a'
// '\uD83D\uDC0A'

对于没有Iterator接口的类似数组对象结构,可以使用Array.from方法将其转为数组,在使用for...of遍历

let arrayLike = { length: 2, 0: 'a', 1: 'b' };

// 报错
for (let x of arrayLike) {
  console.log(x);
}

// 正确
for (let x of Array.from(arrayLike)) {
  console.log(x);
}

对于普通的对象, 可以使用Object.keys()方法将对象的键名生成一个数组,然后再遍历

for (var key of Object.keys(someObject)) {
  console.log(key + ': ' + someObject[key]);
}

for...of与其他遍历语法比较

  • 数组提供内置的forEach方法可以遍历数组的成员,但是该方法中途无法跳出,break和return命令都无法凑效
myArray.forEach(function (value) {
  console.log(value);
});
  • for...in可以用来遍历数组和对象的键名,其无法直接遍历键值,对于数组来说,遍历返回的值是索引的字符串形式,例如”1”,”2”,”3”。除此之外其会遍历手动添加的键名以及原型链上的键。在某些情况下,for...in还会以任意顺序遍历键名
  • -
新英格兰10机39节点matlab建模,ieee10机39节点系统数据 【实例简介】ieee10机39节点系统数据,主要是BPA数据!【实例截图】【核心代码】ne_039_bus└── ne_039_bus├── 039readme.doc├── bpa│ ├── 039bpa.dat│ ├── 039bpa.swi│ ├── LFerr.LIS│ ├── OneNote 目录.onetoc2│ └── STERR.LIS├── eurostag│... 阅读详情

相关推荐

避坑指南:大疆智图集群建模中5个90%新手会踩的雷(附错误日志分析)

本文针对大疆智图集群建模功能,总结了新手在部署和运行时极易遇到的五个常见问题,包括共享目录权限与路径、主从节点版本一致性、临时存储路径设置、网络与防火墙配置以及错误日志分析。文章结合具体错误日志,提供了详细的排查步骤和解决方案,旨在帮助用户快速定位并解决问题,充分发挥集群建模的效率优势。

weixin_29238147的博客 335

for...of 循环(ES6)

ES6 借鉴 C++、Java、C# 和 Python 语言,引入了for...of循环,作为遍历所有数据结构的统一的方法。 一个数据结构只要部署了Symbol.iterator属性,就被视为具有 iterator 接口,就可以用for...of循环遍历它的成员。也就是说,for...of循环内部调用的是数据结构的Symbol.iterator方法。 for...of循环可以使用的范围包括数组...

VivBin的博客 3497

什么!!!寒假就要准备暑期实习

介绍暑期实习,从作用,时间线,投递渠道,技术准备,常见问题,经验教训几个方面介绍暑期实习

今天不coding的博客 1726

Iterator(迭代器)的用法及其背后机制的探究

Iterator 怎么使用?有什么特点? Java中的Iterator功能比较简单,并且只能单向移动: (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。 (2) 使用next()获得序列中的下一个元...

数据与算法架构提升之路专栏 1948

comsol-声学

COMSOL多物理场仿真软件以高效的计算性能和杰出的多场耦合分析能力实现了精确的数值仿真,已被广泛应用于各个领域的科学研究以及工程计算,为工程界和科学界解决了复杂的多物理场建模问题。COMSOL内嵌的声学模块可以方便地进行多孔声学和粘热声学的模拟仿真。软件数值计算得到的云图,可以将声压、速度、声强以及声能耗散等结果可视化,十分有利于学生对声学的学习和理解。将COMSOL仿真引入实验当中,通过软件的可视化处理有效直观的展示复杂物理场和集合模型仿真的流程,与实验数据结合,使得文章内容具有说服力、预见性和新颖性。

y2715163545的博客 2376

配置 Druid 数据源及密码加密-SpringBoot 实战基础

在SpringBoot中配置 Druid 数据源及密码加密的方法前文集成 MyBatis Plus,实现了一组增删改查接口。在启动服务时,从控制台中可以看出 Spring Boot 默认使用 Hikari 作为数据库连接池,Hikari性能很优秀。在国内使用较多的连接池还属阿里开源的 Druid,中文发音为德鲁伊。Druid 结合了 C3P0、DBCP 等 DB 池的优点,同时还加入了日志监控,可以很好的监控 DB 池连接和 SQL 的执行情况。...

m0_67698950的博客 954

ES6学习——迭代器(Iterators):return和throw概述

Iterator接口还有两个可选方法,一直都没讲,主要是由于浏览器没有完全支持这两个方法。最后我们看一下: 然后规范上有一段描述: NOTE 2 Typically callers of these methods should check for their existence before invoking them. Certain ECMAScript language fea

Challenge Next Challenge 3008

zemax光线光扇图

通过入瞳某一坐标(PX,PY)的光线在像面上有唯一的位置(EX,EY),以EX,EY为纵坐标,以PX,PY为横坐标,分别建立坐标系,把通过入瞳的光线都在坐标系里描点就得到了光扇图。对于视场内任意一点,取其子午面内的光线,以光线在光阑面上的透射点坐标为横坐标,同时以该光线在像面上的坐标为纵坐标,描出所有点,构成的图形即为子午面光扇图。在焦点位置,曲线的斜率为0,也就是说,不管入射时的横坐标(光阑面上的位置)是多少,离轴多远,都将汇聚在焦点处。此时,子午面和弧矢面有不同的分布,两条曲线不重合。

fendoudecheng的博客 8098

14、ES6 for...of循环

类似数组的对象类似数组的对象包括好几类。下面是for…of循环用于字符串、DOM NodeList对象、arguments对象的例子。 //字符串        demo                   let str="hello";       for(let s of str){         console.log(s);        //h

小雨的博客 533

单细胞测序流程(五)t-sne聚类分析和寻找marker基因

系列文章目录 单细胞测序流程(一)简介与数据下载 单细胞测序流程(二)数据整理 单细胞测序流程(三)质控和数据过滤——Seurat包分析,小提琴图和基因离差散点图 单细胞测序流程(四)主成分分析——PCA 本期主讲内容——t-sne聚类分析和寻找marker基因 介绍:T-SNE是一种用于探索高维数据的非线性降维算法。它将多维数据映射到适合于人类观察的两个或多个维度。 一、课前准备 之前所使用的数据 R语言的IDE 二、过程 聚类分析的目的是根据细胞的差别所进行细胞分群,两个..

qq_45478665的博客 2万+

ThingsBoard集群部署之k8s

今天终于有时间去搞这个啦,拖了很久了,一直没时间,因为我本地没有那么多机器资源,开虚拟机不够,如果租用阿里云服务器,需要有充值的时间,因为这个费用是按小时付费,需要有连贯的时间来搞才行,今天恰好有时间,就开始搞了,弄成功搞出来了,特地写博客记录下来。

AldrichEugene 1175

es6 map遍历_前端开发必备 - ES6 新特性之 Iterator和 for...of循环

往期回顾:前端开发必备 - ES6 新特性之 let 和 const 命令前端开发必备 - ES6 新特性之 变量的解构赋值前端开发必备 - ES6 新特性之 字符串的拓展前端开发必备 - ES6 新特性之 正则的拓展前端开发必备 - ES6 新特性之 数值的拓展前端开发必备 - ES6 新特性之 对象的拓展前端开发必备 - ES6 新特性之 Symbol前端开发必备 - ES6 新特性之 Set...

weixin_39879881的博客 349

基于Simulink的BCH码编解码仿真建模示例

BCH码是一类循环码,能够纠正一定数量的随机错误。灵活性:可以根据需要选择不同的码长和纠错能力。高效性:适用于短码长和中等码长的场景,广泛用于卫星通信、存储系统等。实现简单:编码和解码过程可以通过硬件或软件高效实现。在本示例中,我们将使用MATLAB/Simulink中的和模块来完成BCH码的编解码操作,并通过仿真验证其误码率(BER)性能。通过本指南,我们介绍了如何基于Simulink搭建一个BCH码的编解码模型,并进行了仿真以验证其性能。背景介绍:理解BCH码的基本原理及其在通信系统中的应用。

xiaoheshang_123的博客 191

ES6 学习13 简单归纳Iterator(遍历器) 和 for...of 循环

1.Iterator(遍历器) 1.1.概述 JavaScript原有的 用来表示集合的数据结构, 数组(Array) 对象(Object) ES6又增加了两种 Set(类似数组) Map(类似对象) 这样就有了 4 种表示集合的数据结构,开发者可以根据自己需求,组合它们,定义自己需要的数据结构。 然而这样就需要一种统一的接口机制,来处理所有不同的数据结构。 Iterator的作用有三...

pspxuan的博客 253

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

es6 依赖循环_ES6-Iterator & for...of循环

1 2 3 4 5 [es6]-13-Iterator和for...of循环6 7 8 /*9 * Iterator遍历器的概念10 * 遍历器是一种接口,为各种不同的数据结构提供统一的访问机制。任何11 * 数据结构只要部署Iterator接口,就可以完成遍历操作。12 *13 * Iterator的...

weixin_39606177的博客 132

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ES6学习笔记(十三)Iterator遍历器和for...of循环

1.概念 遍历器(Iterator)就是这样一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator 接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。 Iterator 的作用有三个: 一是为各种数据结构,提供一个统一的、简便的访问接口; 二是使得数据结构的成员能够按某种次序排列; 三是 ES6 创造了一种新的遍历命令for....

weixin_30247159的博客 171

es6 对象中是否有键值_前端开发必备 - ES6 新特性之 Iterator和 for...of循环

往期回顾:前端开发必备 - ES6 新特性之 let 和 const 命令前端开发必备 - ES6 新特性之 变量的解构赋值前端开发必备 - ES6 新特性之 字符串的拓展前端开发必备 - ES6 新特性之 正则的拓展前端开发必备 - ES6 新特性之 数值的拓展前端开发必备 - ES6 新特性之 对象的拓展前端开发必备 - ES6 新特性之 Symbol前端开发必备 - ES6 新特性之 Set...

weixin_35781524的博客 90

[es6]Symbol.iterator 和 for of

使用 Symbol.iterator for of s6 学习笔记

gjc9620的专栏 3501

13、ES6 Iterator(遍历器)的概念

1. Iterator(遍历器)的概念 JavaScript原有的表示“集合”的数据结构,主要是数组(Array)和对象(Object),ES6又添加了Map和Set。这样就有了四种数据集合,用户还可以组合使用它们,定义自己的数据结构,比如数组的成员是Map,Map的成员是对象。这样就需要一种统一的接口机制,来处理所有不同的数据结构。 遍历器(Iterator)就是这样一种机制。它是一种接口,

小雨的博客 491

es6的iterator和for of循环

for-of不仅仅可以用于数组,还可以用在dom对象上,同样作用于Map和Set对象。

zhanglir333的博客 362

forEach,for in,for of循环的用法

一、一般的遍历数组的方法: var array = [1,2,3,4,5,6,7]; for (var i = 0; i < array.length; i) { console.log(i,array[i]); } 二、用for in的方遍历数组 for(let index in array) { ...

仗剑天涯,从摘要开始 828

ES6入门:iterator迭代器

迭代模式 ES6迭代器标准化接口 迭代循环 自定义迭代器 迭代器消耗 一、迭代模式 迭代模式中,通常有一个包含某种数据集合的对象。该数据可能存在一个复杂数据结构内部,而要提供一种简单的方法能够访问数据结构中每个元素。对象消费者并不需要知道如何组织数据,所有需要做的就是取出单个数据进行工作。 迭代模式API的设计:通常会设置一个next()方法来获取每个元素;为了方...

weixin_30949361的博客 806

TypeScript 迭代器(Iterators)实战指南:从 Iterator 接口到 IterableIterator 与 Symbol.iterator

本指南聚焦 TypeScript 中迭代器(Iterator)的完整用法:从最基础的 `Iterator<T>` 接口与 `IteratorResult<T>` 值结构讲起,逐步过渡到 ES6 的 *iterable protocol*(`Symbol.iterator`)与 `Iterable<T>`、`IterableIterator<T>` 接口,并用 `Frame` 组件遍历、斐波那契数列

gitblog_00459的博客 1105

js中forEach,for in,for of循环的用法

一、一般的遍历数组的方法: var array = [1,2,3,4,5,6,7]; for (var i = 0; i < array.length; i) { console.log(i,array[i]); } 二、用for in的方遍历数组 for(let index in array) { ...

D船长的博客 321

华为社招面试,ES6 入门—ES6 迭代器,2024前端大厂面试经验

随后通过 next 方法进行向下迭代指向下一个位置,next 方法会返回当前位置的对象,对象包含了 value 和 done 两个属性,value 是当前属性的值,done 用于判断是否遍历结束;迭代器,是 ES6 引入的一种新的遍历机制,主要讲解的是 Iterator 、迭代过程、可迭代的数据结构。String,Array,Map,Set,Dom 元素是所有内置的可迭代对象,他们的原型对象都有一个。迭代器是一个统一的接口,它的作用是使各种数据结构可被便捷的访问,它是通过一个键为。

2401_83974199的博客 612

ES6常用知识点总结

  这片文章主要是基于阮一峰老师的ECMAScript 6 入门。在看了阮一峰老师的这ES6入门之后,自己做了一下总结,将一些觉得对自己目前有用的东西整理出来方便日后再来巩固复习。总觉得看别人的东西当时懂了过了一段时间就忘记了,所以我总是会将别人的东西验证一遍,这样对知识的理解是能提升一个层次的。 1、ECMAScript和JavaScript的关系以及ES6的含义? 2、let和const ...

大灰狼的小绵羊哥哥的博客 1312
上一篇: ES6学习笔记12 Promise
下一篇: ES6学习笔记14 Generator 函数
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值