千家信息网

ES6迭代器怎么实现

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,本篇内容介绍了"ES6迭代器怎么实现"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Iterator
千家信息网最后更新 2025年01月21日ES6迭代器怎么实现

本篇内容介绍了"ES6迭代器怎么实现"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Iterator 是 ES6 引入的一种新的遍历机制,迭代器有两个核心概念:迭代器是一个统一的接口,它的作用是使各种数据结构可被便捷的访问,它是通过一个键为Symbol.iterator 的方法来实现。
迭代器是用于遍历数据结构元素的指针(如数据库中的游标)。

Iterator

Iterator 是 ES6 引入的一种新的遍历机制,迭代器有两个核心概念:

  1. 迭代器是一个统一的接口,它的作用是使各种数据结构可被便捷的访问,它是通过一个键为Symbol.iterator 的方法来实现。

  2. 迭代器是用于遍历数据结构元素的指针(如数据库中的游标)。

迭代过程

迭代的过程如下:

  1. 通过 Symbol.iterator 创建一个迭代器,指向当前数据结构的起始位置

  2. 随后通过 next 方法进行向下迭代指向下一个位置, next 方法会返回当前位置的对象,对象包含了 value 和 done 两个属性, value 是当前属性的值, done 用于判断是否遍历结束

  3. 当 done 为 true 时则遍历结束

下面通过一个简单的例子进行说明:

const items = ["zero", "one", "two"];const it = items[Symbol.iterator](); it.next();>{value: "zero", done: false}it.next();>{value: "one", done: false}it.next();>{value: "two", done: false}it.next();>{value: undefined, done: true}

上面的例子,首先创建一个数组,然后通过 Symbol.iterator 方法创建一个迭代器,之后不断的调用 next 方法对数组内部项进行访问,当属性 done 为 true 时访问结束。

迭代器是协议(使用它们的规则)的一部分,用于迭代。该协议的一个关键特性就是它是顺序的:迭代器一次返回一个值。这意味着如果可迭代数据结构是非线性的(例如树),迭代将会使其线性化。

可迭代的数据结构

以下是可迭代的值:

  1. Array


  2. String


  3. Map


  4. Set


  5. Dom元素(正在进行中)

我们将使用 for...of 循环(参见下文的 for...of 循环)对数据结构进行迭代。

Array

数组 ( Array ) 和类型数组 ( TypedArray ) 他们是可迭代的。

for (let item of ["zero", "one", "two"]) {  console.log(item);}// output:// zero// one// twoString

字符串是可迭代的,单他们遍历的是 Unicode 码,每个码可能包含一个到两个的 Javascript 字符。

for (const c of 'z\uD83D\uDC0A') {    console.log(c);}// output:// z// \uD83D\uDC0A

Map

Map 主要是迭代它们的 entries ,每个 entry 都会被编码为 [key, value] 的项, entries 是以确定的形势进行迭代,其顺序是与添加的顺序相同。

const map = new Map();map.set(0, "zero");map.set(1, "one"); for (let item of map) {  console.log(item);}// output:// [0, "zero"]// [1, "one"]

注意: WeakMaps 不可迭代

Set

Set 是对其元素进行迭代,迭代的顺序与其添加的顺序相同

const set = new Set();set.add("zero");set.add("one"); for (let item of set) {  console.log(item);}// output:// zero// one

注意: WeakSets 不可迭代

arguments

arguments 目前在 ES6 中使用越来越少,但也是可遍历的

function args() {  for (let item of arguments) {    console.log(item);  }}args("zero", "one");// output:// zero// one

普通对象不可迭代

普通对象是由 object 创建的,不可迭代:

// TypeErrorfor (let item of {}) {   console.log(item);}

for...of循环

for...of 是 ES6 新引入的循环,用于替代 for..in 和 forEach() ,并且支持新的迭代协议。它可用于迭代常规的数据类型,如 Array 、 String 、 Map 和 Set 等等。

迭代常规数据类型

Array

const nums = ["zero", "one", "two"]; for (let num of nums) {  console.log(num);}TypedArrayconst typedArray1 = new Int8Array(6);typedArray1[0] = 10;typedArray1[1] = 11; for (let item of typedArray1) {  console.log(item);}

String

const str = "zero"; for (let item of str) {  console.log(item);}

Map

let myMap = new Map();myMap.set(0, "zero");myMap.set(1, "one");myMap.set(2, "two"); // 遍历 key 和 valuefor (let [key, value] of myMap) {  console.log(key + " = " + value);}for (let [key, value] of myMap.entries()) {  console.log(key + " = " + value);} // 只遍历 keyfor (let key of myMap.keys()) {  console.log(key);} // 只遍历 valuefor (let value of myMap.values()) {  console.log(value);}

Set

let mySet = new Set();mySet.add("zero");mySet.add("one");mySet.add("two"); // 遍历整个 setfor (let item of mySet) {  console.log(item);} // 只遍历 key 值for (let key of mySet.keys()) {  console.log(key);} // 只遍历 valuefor (let value of mySet.values()) {  console.log(value);} // 遍历 key 和 value ,两者会相等for (let [key, value] of mySet.entries()) {  console.log(key + " = " + value);}

可迭代的数据结构

of 操作数必须是可迭代,这意味着如果是普通对象则无法进行迭代。如果数据结构类似于数组的形式,则可以借助 Array.from() 方法进行转换迭代。

const arrayLink = {length: 2, 0: "zero", 1: "one"}
// 报 TypeError 异常for (let item of arrayLink) {  console.log(item);} // 正常运行// output:// zero// onefor (let item of Array.from(arrayLink)) {  console.log(item);}

let 、const 和 var 用于 for..of

如果使用 let 和 const ,每次迭代将会创建一个新的存储空间,这可以保证作用域在迭代的内部。

const nums = ["zero", "one", "two"]; for (const num of nums) {  console.log(num);}// 报 ReferenceErrorconsole.log(num);

从上面的例子我们看到,最后一句会报异常,原因 num 的作用域只在循环体内部,外部无效,具体可查阅 let 与 const 章节。使用 var 则不会出现上述情况,因为 var 会作用于全局,迭代将不会每次都创建一个新的存储空间。

const nums = ["zero", "one", "two"]; forv (var num of nums) {  console.log(num);}// output: twoconsole.log(num);

"ES6迭代器怎么实现"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

迭代 数据 数据结构 结构 方法 作用 对象 数组 顺序 循环 两个 元素 普通 位置 例子 属性 类型 过程 便捷 相同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库查找数据源的子句代码 华为服务器带外管理日志采集 消防进行网络安全检查 网络安全与风险有哪些 联想二手服务器图片 服务器开机存储出现红色感叹号 中小学网络安全答题 比较好的软件开发定做公司 网络安全周 情景剧 框架在软件开发中的作用 烟台思维能量网络技术有限公司 深圳市艾特科技互联网发展 历史数据库故事 网络安全手抄报内容50个字 智慧水利综合管理服务器 秦皇岛海蒂软件开发公司电话 海参功能成分含量数据库 联通光猫连接路由器服务器无响应 网络安全数据分析统计服 大专工业网络技术升本专业 信誉好的浪潮服务器代理商哪里有 外文数据库检索作者名字 数据库远程登录连接超时 流水线仿真软件开发 服务器环境配置是什么 遨游网络安全儿童画 网络安全趋势卡 网络安全小组学习 递归关系和高级数据库 嘉兴常用网络技术应用
0