【面试题】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.hqwc.cn/news/223015.html

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

相关文章

进程等待讲解

今日为大家分享有关进程等待的知识&#xff01;希望读完本文&#xff0c;大家能有一定的收获&#xff01; 正文开始&#xff01; 进程等待的引进 既然我们今天要讲进程等待这个概念&#xff01;那么只有我们把下面这三个方面搞明白&#xff0c;才能真正的了解进程等待&#x…

基于OpenCV+YOLOv5实现车辆跟踪与计数(附源码)

导 读 本文主要介绍基于OpenCVYOLOv5实现车辆跟踪与计数的应用&#xff0c;并给出源码。 资源下载 基础代码和视频下载地址&#xff1a; https://github.com/freedomwebtech/win11vehiclecount main.py代码:​​​​​​​ import cv2import torchimport numpy as npfrom tr…

spring Cloud在代码中如何应用,erueka 客户端配置 和 服务端配置,Feign 和 Hystrix做高可用配置

文章目录 Eureka一、erueka 客户端配置二、eureka 服务端配置 三、高可用配置FeignHystrix 通过这篇文章来看看spring Cloud在代码中的具体应用&#xff0c;以及配置和注解&#xff1b; Eureka 一、erueka 客户端配置 1、Eureka 启禁用 eureka.client.enabledtrue 2、Eurek…

Android修行手册-ViewPager定制页面切换以及实现原理剖析

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

基于Springboot的墙绘产品展示交易平台(有报告),Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的墙绘产品展示交易平台&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff0…

基于DSP/SOC音乐灯效系统设计方法

音乐灯效系统设计方法 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群赠送语音信号处理降噪算法,蓝牙耳机音频,DSP音频项目核心开发资料, 三种方法: (1)MIC 采集音乐信号变化,(2)直接获取SPK 模拟音频…

20231127让RK3399的挖掘机开发板在Andorid12系统下休眠唤醒之后禁止锁屏

20231127让RK3399的挖掘机开发板在Andorid12系统下休眠唤醒之后禁止锁屏 2023/11/27 20:55 适用于SOC以及系统版本&#xff1a; RK3399&#xff1a;Android10/11/12 RK3568&#xff1a;Android11/12 RK3588&#xff1a;Android12 当RK3399平台的Android12系统在休眠之后&#x…

笔记62:注意力汇聚 --- Nadaraya_Watson 核回归

本地笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\3.循环神经网络\第10章&#xff1a;动手学深度学习~注意力机制 a a a a a a a a a a a a a a a a

Vue简单的表单操作

效果预览图 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>作业</title><styl…

<Linux> 文件理解与操作

目录 前言&#xff1a; 一、关于文件的预备知识 二、C语言文件操作 1. fope 2. fclose 3. 文件写入 3.1 fprintf 3.2 snprintf 三、系统文件操作 1. open 2. close 3. write 4. read 四、C文件接口与系统文件IO的关系 五、文件描述符 1. 理解文件描述符 2. 文…

P22 C++数组

目录 前言 01 什么是数组 02 如何定义数组 2.1 那么如何设置和访问这些整数呢&#xff1f; 2.2 小心内存越界 2.3 for循环遍历数组 03 在堆上创建数组 前言 本期我们讨论 C 中的数组。 在我们开始讨论数组之前&#xff0c;要先理解指针是什么&#xff0c;因为指针基本上…

饺子馆外卖点餐系统小程序效果如何

餐饮行业所涵盖的细分类目非常广&#xff0c;同时又是经济发展的重要支撑&#xff0c;市场规模非常高。饺子是很多人非常喜欢吃的食物&#xff0c;尤其过年的时候&#xff0c;必是少不了几碗饺子&#xff0c;平时也有大量人前往饺子馆。 但相对比火锅、炒菜馆则少些竞争力&…