百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

通过几个事例,就可以说明 for...of 循环在 JS 是不可或缺

toyiye 2024-08-09 10:39 16 浏览 0 评论

请教大家一个问题:什么特性让该编程语言更加优秀?

个人见解:当该特性可以组合多个其他语言特性时。

JavaScript 中的for...of语句就是这种情况,可从ES2015开始使用。

for...of可以迭代数组,类似数组的对象以及通常所有可迭代的对象(map,set,DOM集合)。

接下我们通过事例来看看 for...of 一些有用的地方。

1. 数组的迭代

for...of的最常见应用是对数组项进行迭代。该循环可以很好且短暂地完成它,而无需其他变量来保持索引。

例如:

for...of循环遍历products,迭代的每项值分配给变量product。

数组方法 entries() 可以用于访问迭代项的索引,该方法在每次迭代时返回一组键值对[index, item]。

const products = ['橘子', '苹果']

for (const [index, product] of products.entries()) {
  console.log(index, product)
}
// 0 "橘子"
// 1 "苹果"

在每次迭代中,products.entries()返回一对索引和值,它们由const [index,product]表达式解构。

1.1 就地解构

首先,让我们看一下 for...of 循环的语法:

for (LeftHandSideExpression of Expression) {
  // statements
}

LeftHandSideExpression表达式可以替换为赋值表达式左侧的任何内容。

在上面的例子中,LeftHandSideExpression是一个变量声明 const products,也可以是一个解构表达式 const [index, product]。

接着,我们遍历一系列对象,提取每个对象的属性name :

const persons = [
  { name: '前端小智' },
  { name: '王大冶' }
]

for (const { name } of persons) {
  console.log(name)
}

// 前端小智
// 王大冶

循环for (const { name } of persons) 遍历person数组的对象,同时也就地解构( {name}) person对象的 name 属性值。

2. 类似数组遍历

for...of 除了可以遍历对象外,还可以遍历类似数组的对象。

arguments是函数体内的特殊变量,表示包含函数的所有参数,arguments也是一个类似数组对象。例如:

function sum() {
  let sum = 0
  for (const number of arguments) {
    sum += number
  }

  return sum
}

sum(1, 2, 3) // 6

3.可迭代的简要概述

JavaScript中的可迭代对象是什么? 它是一个支持迭代协议的对象。

要检查数据类型是否可迭代,可以配合Symbol.iterator方法。例如,下面的演示显示了数组是可迭代的:

const array = [1, 2, 3]
const iterator = array[Symbol.iterator]()
iterator.next()  // {value: 1, done: false}

for...of接受可迭代,这很棒,因为这样,我们就可以遍历字符和数据结构(数组,类型化数组,集合,映射)等。

4. 字符串字符的遍历

JavaScript 中的原始类型字符串是可迭代的。因此,我们可以轻松地遍历字符串的字符。

const message = 'hello';

for (const character of message) {
  console.log(character);
}
// 'h'
// 'e'
// 'l'
// 'l'
// 'o'

message包含一个字符串值。由于message也是可迭代的,因此for...of循环遍历message的字符。

5. Map 与 Set 迭代

Map是一个特殊的对象,它将一个键关联到一个值。键可以是任何基本类型(通常是字符串,但也可以是数字等)

幸运的是,Map也是可迭代的(在键/值对上进行迭代),所以使用for...of可以轻松地在所有键/值对上循环遍历。

const names = new Map()
names.set(1, 'one')
names.set(2, 'two')

for (const [numbe, name] of names) {
  console.log(number, name)
}

// 1 "one"
// 2 "two"

for (const [number, name] of names)在names 键/值对映射上进行迭代。

在每个循环中,迭代器都会返回一个数组[key,value],并使用const [number,name]立即对这对数组进行解构。

同样,以相同的方式可以遍历Set的项:

const colors = new Set(['white', 'blue', 'red', 'white']);

for (color of colors) {
  console.log(color);
}
// 'white'
// 'blue'
// 'red'

6. 遍历普通 JavaScript 对象

遍历普通 JS 对象的属性/值对总是很痛苦的。

通常,我要先使用Object.keys()提取对象键,然后使用forEach()来遍历键数组:

const person = {
  name: '前端小智',
  job: '前端分享者'
}

Object.keys(person).forEach(prop => {
  console.log(prop, person[prop])
})

// name 前端小智
// job 前端分享者

幸运的是,新的Object.entries()函数与for...of组合提供了一个不错的选择:

Object.entries(person)返回一个键和值元组数组:[['name', 'John Smith'], ['job', 'agent']]。然后,对于for...of循环,遍历元组,并将每个元组解构const [prop,value]。

7.遍历 DOM 集合

你可能知道在 DOM 中使用HTMLCollection是多么令人沮丧。因为HTMLCollection是一个类似数组的对象(而不是一个常规数组),所以我们不能使用常规数组方法。

例如,每个 DOM 元素的children属性都是HTMLCollection。因此,由于for...of可以在类似数组的对象上进行迭代,因此我们可以轻松地迭代子代:

const children = document.body.children;

for (const child of children) {
  console.log(child); // logs each child of <body>
}

此外,for...of可以遍历NodeList集合(可迭代)。例如,函数document.querySelectorAll(query)返回一个NodeList。

const allImages = document.querySelectorAll('img');

for (const image of allImages) {
  console.log(image); // log each image in the document
}

如果你想遍历 DOM 中的不同种类的集合,那么for...of语句是一个不错的选择。

8. 性能

在遍历大数组时,for...of的速度可能比 for 要慢:

const a = [/* big array */];
for (let i = 0; i < a.length; i++) {
  console.log(a[i]);
}

在每次迭代中调用迭代器比通过增加索引访问该项目的开销更大。但是,这种细微差别在使用大型阵列的应用程序中以及性能至关重要的应用程序中非常重要,这种情况很少发生。


作者:Dmitri Pavlutin 译者:前端小智 来源:Dmitri Pavlutin原文:https://dmitripavlutin.com/javascript-for-of/

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码