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

news2024/12/27 0:17:22

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

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 hours
            close: 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 hours
        close: 24,
    },
};
const restaurant = {
    name: '意大利🇮🇹经典',
    location: 'Via Angelo Tavanti 23, 佛罗伦萨, 意大利',
    categories: ['意大利', '比萨店', '素食', '有机'],
    starterMenu: ['佛卡夏', '意式烤面包', '大蒜面包', '卡普雷塞沙'],
    mainMenu: ['披萨', '意大利面', '烩饭'],
    // ES6 enhanced object literals
    openingHours,
    // 新的对象属性名写法
    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 hours
        close: 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.coloradmin.cn/o/1260844.html

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

相关文章

bmp文件操作和详解

一 BMP文件格式 BMP&#xff08;Bitmap&#xff09;是Windows操作系统中的标准图像文件格式。 由于windows操作系统的发布时机远早于Linux、Android、IOS等操作系统&#xff0c;因此windows中很多数据格式和算法的标准也是当今所有操作系统必须要兼容的标准数据结构和算法。BM…

推动企业数字化转型,如何更好地规避失败风险?

随着科技的飞速发展&#xff0c;数字化转型已成为企业持续发展的必然选择&#xff0c;然而有相关数据显示&#xff0c;超过80%的企业在数字化转型过程中都遭遇失败。本文将揭示企业数字化转型常见的失败原因&#xff0c;并探讨如何帮助企业规避转型失败风险。 一、企业数字化转…

Android修行手册 - 使用ViewPager2实现画廊效果

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

青少年CTF之PHP特性练习(1-5)

青少年CTF-PHP特性练习 文章目录 青少年CTF-PHP特性练习PHP特性01PHP特性02PHP特性03PHP特性04PHP特性05 PHP特性01 看给出的源码&#xff0c;两个变量的值加密后的MD5相同 <?php$s1 "%af%13%76%70%82%a0%a6%58%cb%3e%23%38%c4%c6%db%8b%60%2c%bb%90%68%a0%2d%e9%47…

使用Arthas排查性能问题

Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff0c;监测方法执行耗时&#xff0c;类加载信…

小程序----使用图表显示数据--canvas

需求&#xff1a;在小程序上实现数据可视化 思路&#xff1a;本来想用的是echarts或者相关的可视化插件&#xff0c;但因为用的是vue3&#xff0c;大多数插件不支持&#xff0c;所以用了echarts&#xff0c;但最后打包的时候说包太大超过2M无法上传&#xff0c;百度了一下&…

汽车功能安全ISO26262

一、功能安全基本概念及功能安全管理 什么是功能安全 相关标准&#xff1a; 现状&#xff1a; 功能安全的目的和范围&#xff1a; 总体框架&#xff1a; 基本定义&#xff1a;

vue3中toRaw 与 markRaw

toRaw 返回由 reactive 或 readonly 方法转换成响应式代理的普通对象。 这是一个还原方法&#xff0c;可用于临时读取&#xff0c;访问不会被代理/跟踪&#xff0c;写入时也不会触发界面更新。 markRaw 标记一个对象&#xff0c;使其永远不会转换为代理。返回对象本身 应…

企业软件手机app定制开发新趋势|网站小程序搭建

企业软件手机app定制开发新趋势|网站小程序搭建 随着移动互联网的快速发展和企业数字化转型的加速&#xff0c;企业软件手机App定制开发正成为一个新的趋势。这种趋势主要是由于企业对于手机App的需求增长以及现有的通用应用不能满足企业特定需求的情况下而产生的。 首先&#…

解决:AttributeError: module ‘os’ has no attribute ‘mknod’

解决&#xff1a;AttributeError: module ‘os’ has no attribute ‘mknod’ 文章目录 解决&#xff1a;AttributeError: module os has no attribute mknod背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在使用之前的代码时&#xff0c;报错…

小航助学题库蓝桥杯题库stem选拔赛(21年3月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSD…

小航助学题库蓝桥杯题库stem选拔赛(22年1月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSD…

【JDK21】详解虚拟线程

目录 1.概述 2.虚拟线程是为了解决哪些问题 2.1.线程切换的巨大代价 2.2.哪些情况会造成线程的切换 2.3.线程资源是有限的 3.虚拟线程 4.适用场景 1.概述 你发任你发&#xff0c;我用JAVA8&#xff1f;JDK21可能要对这句话say no了。 现在Oracle JDK是每4个版本&#x…

Android系统源码中添加可编译运行执行程序,C,C++

文章目录 Android系统源码中添加可编译运行执行程序&#xff0c;C&#xff0c;C1. 源码product分区中添加可执行程序 Android系统源码中添加可编译运行执行程序&#xff0c;C&#xff0c;C 1. 源码product分区中添加可执行程序 新建一个文件夹&#xff0c;以及一个test.cpp文…

【设计模式】03:单例模式

单例模式 OVERVIOW 单例模式1.单例模式实现2.饿汉与懒汉&#xff08;1&#xff09;饿汉模式&#xff08;2&#xff09;懒汉模式 3.懒汉线程安全1&#xff08;1&#xff09;引入互斥锁&#xff08;2&#xff09;引入双重检查锁定&#xff08;3&#xff09;引入原子变量 4.懒汉线…

RWA+AI 叙事下的 ProsperEx,对 Web3 时代交易的重新定义

RWA&#xff08;Real World Assets&#xff09;即现实资产代币&#xff0c;其本质在于将现实世界中具有货币价值的东西转化为数字代币&#xff0c;使其可以在区块链上表现价值并进行交易。RWA 资产既可以包括有形资产&#xff0c;例如房产、珠宝、黄金等&#xff0c;也可以包无…

第一节HarmonyOS DevEcoStudio工具下载以及环境搭建

一、下载与安装DevEco Studio 在HarmonyOS应用开发学习之前&#xff0c;需要进行一些准备工作&#xff0c;首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 进入DevEco Studio 工具下载官网&#xff1a;https://developer.harmonyos.com/cn/develop/deveco-stu…

OpenCvSharp从入门到实践-(04)色彩空间

目录 1、GRAY色彩空间 2、从BGR色彩空间转换到GRAY色彩空间 2.1色彩空间转换码 2.2实例 BGR色彩空间转换到GRAY色彩空间 3、HSV色彩空间 4、从BGR色彩空间转换到HSV色彩空间 4.1色彩空间转换码 4.2实例 BGR色彩空间转换到HSV色彩空间 1、GRAY色彩空间 GRAY色彩空间通常…

上游任务和下游任务

起源多任务学习中的定义理解结合定义分析例子示例 1&#xff1a;计算机视觉示例 2&#xff1a;自然语言处理示例 3&#xff1a;语音处理示例 4&#xff1a;强化学习总结 起源 "上游任务"和"下游任务"这两个术语在深度学习领域中通常用来描述一种 多任务学…

适用于iOS 的顶级苹果数据恢复软件

数据丢失可能随时发生在任何人身上&#xff0c;这可能是一种令人沮丧的经历。丢失 iOS 设备上的重要数据可能会造成特别严重的损失&#xff0c;因为其中可能包括有价值的照片、联系人、消息和其他重要文件。幸运的是&#xff0c;有多种数据恢复工具可以帮助用户恢复丢失的数据。…