【面试题】JavaScript高级循环方法

给大家推荐一个实用面试题库

1、前端面试题库 (面试必备)            推荐:★★★★★

地址:web前端面试题库

除了for循环♻️,for-of,for-each循环♻️也是一个不错的选择

先说for-of循环♻️

认识for-of循环♻️
for(const /* 循环对象集合中的每个元素 */ of /* 循环对象集合 */ ){/* 循环体 *//* 你可以在循环体中取出循环对象集合中的每一个元素 */
}

通过for-of循环♻️,可以对数组Array、对象Object等可迭代变量进行像键值对一样的循环遍历操作。换句话说,你不需要亲自创建索引来依次遍历并取出集合中的每一个元素;此循环会将集合中的每一个元素创建对应的索引,通过索引来遍历整个数组中的元素。

另外,如果你觉得这样不好记忆,你可以换一种方式:在英文中,The color of books 指的是图书的颜色。图书是一个整体,而每一本书的封皮颜色都是不同的,是图书整体中的个体。通过这种方式可以很快的理解for-of循环机制。

使用for-of循环遍历数组元素

restaurant对象

const restaurant = {name: '意大利🇮🇹经典',location: 'Via Angelo Tavanti 23, 佛罗伦萨, 意大利',categories: ['意大利', '比萨店', '素食', '有机'],starterMenu: ['佛卡夏', '意式烤面包', '大蒜面包', '卡普雷塞沙'],mainMenu: ['披萨', '意大利面', '烩饭'],openingHours: {thu: {open: 12,close: 22,},fri: {open: 11,close: 23,},sat: {open: 0, // Open 24 hoursclose: 24,},},
};

利用传统的方法(for循环)来逐次遍历数组中的每个元素

const menu = [...restaurant.starterMenu, ...restaurant.mainMenu];// Normal loop
for (let i = 0; i < menu.length; i++) {console.log(menu[i]);
}

通过方法(for-of循环)来逐次遍历数组中的每个元素:

for(const item of menu){console.log(item);
}

甚至你也可以写成这样:

for(const item of menu) console.log(item);

for-of循环的注意事项📋:

注意:在普通循环♻️和for-of循环中,你还是可以使用break或continue关键字在设定的情况下跳出循环,但是在之后的for-each循环中你将不能做这些

初识entries()

实际上,for-of循环之所以可以做到不设立和操作索引变量index就可以遍历整个数组集合。entries()方法功不可没。实际上在JavaScript中,entries()是一个数组迭代器。

// 如何在for-of循环中获取元素的索引
for (const item of menu.entries()) {console.log(item);
}

entries()方法会将获取到的数组或对象整合到一个对象中,并将他们编排成一个带索引序号和元素内容的一个数组,通过访问对象内数组的第一个元素即可得到索引序号,访问第二个元素即可得到数组中包含的内容。

// menu.entries()到底是什么
// 用console.log(menu.entries());  会返回一个数组迭代器
console.log([...menu.entries()]);   // 探究👀entries()方法下的数组迭代器内部是什么样子

既然这样,如果我们将刚刚得到的menu菜单数组进行遍历,如果我们不了解for-of循环的运行原理,我们只能这样写:

// 利用for-of循环打印一个菜单
// 旧式写法
for (const item of menu.entries()) {console.log(`${item[0] + 1}: ${item[1]}`);
}

实际上,通过entries()方法,我们可以对数组进行解构操作。将得到的item的每一项分解成iel。通过变量i获取每一个数组中的第一个元素——即序号;通过变量el获取每个数组中的第二个元素——即内容和值。

对于这个数组来说,item中的第一个元素一定是1,2,3...等序号,第二个元素就是序号对应的菜品和食物🍜。

//新写法
//因为在for-of-loop中已经将menu数组解构成索引加内容的样式,所以直接用变量去替代
//索引序号即可
for (const [i, el] of menu.entries()) {console.log(`${i + 1}: ${el}`);
}

测试结果,两次输出的结果是一样的。

使用for-of循环遍历对象内属性

使用for-of循环同样可以遍历对象内部的属性。实际上对象内部的属性也可以被称为键,而属性对应的内容称为值。通过for-of循环可以通过键值对的方式逐次遍历对象内部的属性。

对象restaurant :

const weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
const openingHours = {[weekdays[3]]: {open: 12,close: 22,},[weekdays[4]]: {open: 11,close: 23,},[weekdays[5]]: {open: 0, // Open 24 hoursclose: 24,},
};
const restaurant = {name: '意大利🇮🇹经典',location: 'Via Angelo Tavanti 23, 佛罗伦萨, 意大利',categories: ['意大利', '比萨店', '素食', '有机'],starterMenu: ['佛卡夏', '意式烤面包', '大蒜面包', '卡普雷塞沙'],mainMenu: ['披萨', '意大利面', '烩饭'],// ES6 enhanced object literalsopeningHours,// 新的对象属性名写法order(starterIndex, mainIndex) {return [this.starterMenu[starterIndex], this.mainMenu[mainIndex]];},
};

目前在restaurant对象中具有openingHours这个属性,通过for-of循环可以将openingHours属性内的对象和元素依次解构。

通过for-of循环 ♻️ 遍历restaurant对象中的openingHours属性

for (const day of Object.keys(openingHours)) {console.log(day);
}

利用Object.keys()获取到对象中的属性(键)

而且,通过Object.keys()方法获取到的键值会将他们集成到一个数组中,因此对数组可以进行的操作,同样适用于此。

const properties = Object.keys(openingHours);
console.log(properties);console.log(`We are open on ${properties.length} days我们店铺开${properties.length}天。`);

另外,获取到的键值对依然可以附加到字符串中,这并不影响字符串的连接。for-of循环会将遍历得到的键值附加到字符串的末尾。

for (const day of properties) {openStr += `${day},`;
}
console.log(openStr);

利用Object.values()获取对象属性中的值
// Property VALUES
const values = Object.values(openingHours);
console.log(values);

这些值正好是restaurant对象下的openingHours属性中的键和值:

const weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
const openingHours = {[weekdays[3]]: {open: 12,close: 22,},[weekdays[4]]: {open: 11,close: 23,},[weekdays[5]]: {open: 0, // Open 24 hoursclose: 24,},
};

Object.values()方法会将每个获取到的属性对象封装📦到一个数组中,通过数组访问索引的方式可以依次将属性对应的值和内容取出。

const values = Object.values(openingHours);
console.log(values[0]);

进一步分析entries()方法
// Entries object
const entries = Object.entries(openingHours);
console.log(entries);for (const x of entries) {console.log(x); // 遍历entries获取到其中的每个值
}

对于遍历对象中的属性值和方法,通过entries()会返回一个对象,在数组中依次装载着对象的属性值(键)和对应的值。就类似于这样:

[  index(0): ["key", {object}],index(1): ["key", {object}],index(2): ["key", {object}],
]

因此,现在你可以对通过entries()方法返回对象中的每一个属性元素进行控制,这种方法类似于使用for-of循环♻️来控制数组。

最初使用for-of循环来控制对象和对象内部的属性与值。

for (const x of entries) {console.log(x); // 遍历entries获取到其中的每个值
}

现在可以对属性和值进行更详细的操作。

// 甚至在遍历对象属性中,你也可以使用数组
for (const [key, value] of entries) {console.log(`On ${key} we open at ${open} and close at ${close}`);
}

但是目前通过这种解析方式我们仍无法获取到属性中的每个值——即openingHours对象中Thu键下的属性值。

这是因为:你还需要对value进行解构。value也是键值下的一个对象。

//[key, value]
for (const [key, { open, close }] of entries) {console.log(`On ${key} we open at ${open} and close at ${close}`);
}

给大家推荐一个实用面试题库

1、前端面试题库 (面试必备)            推荐:★★★★★

地址:web前端面试题库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/190455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在手机上打开电脑端本地的网页

目录 一.手机端预览VSCode生成的网页站点二.手机端预览VS2022生成的 WebApi网页站点三.手机端预览VS2022生成的 vueapp前端四.总结 今天遇到了2个小问题&#xff1a;1.想在手机上运行VSCode上写好的网页代码。2.同样在手机上运行VS2022 WebApi生成的网页。查找了一晚上资料&…

哪些AI软件有消除笔?这四款AI软件轻松消除水印

日常生活或工作中&#xff0c;离不开对图片的处理&#xff0c;AI已经对图片视频下手了&#xff0c;处理软件我们不必在用传统的PS来一点点扣了&#xff0c;AI能瞬间消除图片中多余的杂物&#xff0c;大大提高了打工人的工作效率&#xff0c;那么哪些AI软件有消除笔的功能呢&…

VIT总结

关于transformer、VIT和Swin T的总结 1.transformer 1.1.注意力机制 An attention function can be described as mapping a query and a set of key-value pairs to an output, where the query, keys, values, and output are all vectors. The output is computed as a wei…

YOLOv8优化策略:SENetV2,squeeze和excitation全面升级,效果优于SENet | 2023年11月最新成果

🚀🚀🚀本文改进: SENetV2,squeeze和excitation全面升级,作为注意力机制引入到YOLOv8,放入不同网络位置实现涨点 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1.SENetV2 论文:https://arxiv.org/…

C#中GDI+图形图像绘制(直线、矩形、圆、椭圆、圆弧、扇形、多边形)

目录 一、直线 二、矩形 三、椭圆 四、圆 五、圆弧 六、扇形 七、多边形 八、示例源码 一、直线 调用Graphics类中的DrawLine()方法&#xff0c;结合Pen对象可以绘制直线。DrawLine()方法有以下两种构造函数。 第一种用于绘制一条连接两个Point结构的线。当参数pt1的值…

状态类算法复杂排序输出

对于目标检测任务中对某一类的检测结果进行输出的时候&#xff0c;一般都是无序的&#xff0c;很明显这样子很难满足的我们的需求&#xff0c;我们更喜欢他是这样子输出的&#xff1a; &#x1f447; 我们可以看到——”按顺序输出结果“中的字段是完美的和上面图片中的识别结…

大三上oracle数据库期末复习

1、创建表空间 2、创建用户 3、用户授权 oracle数据库逻辑存储结构&#xff1a; 1、表空间&#xff08;最大的逻辑存储单元&#xff09; 创建表空间 2、段 3、盘区&#xff08;最小的磁盘空间分配单元&#xff09; 4、数据块&#xff08;最小的数据读写单元&#xff09; 用…

thinkphp 5.1 对数据库查出来的字段进行预处理

比如数据库的设计是下面这样子&#xff1a; 我想展示的是这个样子&#xff1a; 前端可以处理。 Think PHP的处理方式&#xff1a; 定义属性 &#xff1a; $this->customize 任意值;//这里的之没有作用 <?phpnamespace app\hs\controller\shop;use app\daogou\mo…

分享4个工具,轻松搞定PDF和图像中提取文本

大型语言模型已经席卷了互联网&#xff0c;导致更多的人没有认真关注使用这些模型最重要的部分&#xff1a;高质量的数据&#xff01; 本文旨在提供一些有效从任何类型文档中提取文本的技术。 Python库 本文专注于Pytesseract、easyOCR、PyPDF2和LangChain库。实验数据是一个…

计算机网络TCP篇①

目录 一、TCP 基本信息 1.1、TCP 的头格式 1.2、什么是 TCP 1.3、什么是 TCP 连接 1.4、TCP 与 UDP 的区别 1.2、TCP 连接建立 1.2.1、TCP 三次握手的过程 1.2.2、为什么是三次握手&#xff1f;不是两次&#xff1f;四次&#xff1f;&#xff08;这个问题真是典中典&am…

深度学习实战63-利用自适应混合金字塔网络实现人脸皮肤美颜效果,快速部署与实现一键美颜功能

大家好,我是微学AI,今天给大家介绍一下深度学习实战63-利用自适应混合金字塔网络实现人脸皮肤美颜效果,快速部署与实现一键美颜功能。在本文中,我将介绍一种新颖的自适应混合金字塔网络(ABPN),该网络可以实现对超高分辨率照片的快速局部修饰。该网络主要由两个组件组成:一…

你知道Canary金丝雀版本的由来吗

Canary金丝雀版本是一种软件开发中常见的概念&#xff0c;它作为一种测试和试用版&#xff0c;旨在保护用户安全性和隐私&#xff0c;同时促进创新和改进。本文主要介绍Canary版本的由来。 随着技术的不断进步&#xff0c;软件开发变得越来越复杂且困难。为了满足用户需求并提…

【渗透】记录阿里云CentOS一次ddos攻击

文章目录 发现防御 发现 防御 流量清洗 使用高防

io基础入门

压缩的封装 参考&#xff1a;https://blog.csdn.net/qq_29897369/article/details/120407125?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-120407125-blog-120163063.235v38pc_relevant_sort_base3&spm1001.2101.3001.…

【数据结构(五)】递归

文章目录 1. 递归的概念2. 递归能解决什么问题3. 递归的规则4. 递归实际应用案例4.1. 迷宫问题4.2. 八皇后问题4.2.1. 思路分析4.2.1. 代码实现 1. 递归的概念 简单的说: 递归就是方法自己调用自己&#xff0c;每次调用时传入不同的变量。递归有助于编程者解决复杂的问题&…

数据结构 - 堆:TOP-K问题

问题描述 TOP-K问题&#xff1a;即求数据结合中前K个最大的元素或者最小的元素&#xff0c;一般情况下数据量都比较大 比如&#xff1a;专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等 对于Top-K问题&#xff0c;能想到的最简单直接的方式就是排序&#xff0c;但是&…

Linux部署elasticsearch集群

文章目录 一、集群规划二、安装前准备(所有节点操作)创建数据目录修改系统配置文件/etc/sysctl.conf创建用户组设置limits.conf 三、初始化配置(在节点1上操作)下载安装包解压安装包修改jvm.options文件下配置的所占内存修改集群配置文件elasticsearch.yml将安装包传到另外两个…

00后卷王真的很卷吗?

前言 都在传00后躺平、整顿职场&#xff0c;但该说不说&#xff0c;是真的卷&#xff0c;感觉我都要被卷废了... 前段时间&#xff0c;公司招了一个年轻人&#xff0c;其中有一个是00后&#xff0c;工作才一年多&#xff0c;直接跳槽到我们公司&#xff0c;薪资据说有18K&…

Linux学习——模拟实现mybash小程序

目录 一&#xff0c;跟正宗的bash见个面 二&#xff0c;实现一个山寨的bash 1.提示符 2.输入命令与回显命令 3.解析命令 4.执行命令 5.执行逻辑 三&#xff0c;全部代码 一&#xff0c;跟正宗的bash见个面 在这篇文章中&#xff0c;我会写一个myshell小程序。这个小程序…

logback-spring.xml详解

《springboot使用logback日志框架超详细教程》文中&#xff0c;filter中最重要的两个过滤器LevelFilter&#xff08;日志级别精确匹配&#xff09;、ThresholdFilter&#xff08;阈值过滤&#xff09; 的描述非常准确&#xff1a; springboot使用logback日志框架超详细教程_sp…