【面试题】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 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前端面试题库

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Flutter】graphic图表实现自定义tooltip

renderer graphic中tooltip的TooltipGuide类提供了renderer方法,接收三个参数Size类型,Offset类型,Map<int, Tuple>类型。可查到的文档是真的少,所以只能在源码中扒拉例子,做符合需求的修改。 官方github示例 官方示例 这个例子感觉像是tooltip和提供的那些属性的…

翻页电子书怎么制作?用简单的方法做出炫酷的效果!

现在很多公司都喜欢把一些内容做成电子书的形式&#xff0c;与传统的纸质文献相比呢&#xff0c;电子书具有存储量大、体积小、成本低、信息更新快、方便阅读等不可替代的优势&#xff0c;受到了越来越多人的喜爱。 如何制作翻页电子书呢&#xff1f;今天小编就专门给大家安利…

转录组学习第5弹-比对参考基因组

比对参考基因组 在构建文库的过程中需要将DNA片段化&#xff0c;因此测序得到的序列只是基因组的部分序列。为了确定测序reads在基因组上的位置&#xff0c;需要将reads比对回参考基因组上&#xff0c;这个步骤叫做比对&#xff0c;即文献中所提到的alignment或mapping。包括基…

自动化接口测试:Pytest让你轻松搞定!了解一般流程及方法

首先我们要明确&#xff0c;通常所接口测试其实就属于功能测试&#xff0c;主要校验接口是否实现预定的功能&#xff0c;虽然有些情况下可能还需要对接口进行性能测试、安全性测试。 在学习接口自动化测试之前&#xff0c;我们先来了解手工接口测试怎样进行。 URL组成 为了更…

智能AIGC写作系统ChatGPT系统源码+Midjourney绘画+支持GPT-4-Turbo模型+支持GPT-4图片对话

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

Python爬虫404错误:解决方案总结

在进行网络爬虫开发的过程中&#xff0c;经常会遇到HTTP 404错误&#xff0c;即“Not Found”错误。这种错误通常表示所请求的资源不存在。对于爬虫开发者来说&#xff0c;处理这类错误是至关重要的&#xff0c;因为它们可能会导致爬虫无法正常工作。本文将探讨Python爬虫遇到4…

事务的自动提交机制和隐式提交机制

自动提交机制就是一个sql语句完成默认提交一次&#xff0c;也就是说一个sql语句是原子性的。想关闭这种功能&#xff0c;两种方式一种写START TRANSACTION&#xff0c;另一种SET autocommit OFF 隐式提交机制&#xff0c;在START TRANSACTION后&#xff0c;会有一些情况导致语…

云表|低代码助力职场人,一招制敌解决办公难题

身在职场&#xff0c;我们时常会面临一系列令人头疼的难题&#xff1a; ● 突然被领导要求30分钟内汇总所有人的填报信息&#xff0c;看着面前格式五花八门的Excel表格&#xff0c;我们无所适从&#xff0c;不知从何下手。 ● 在这个数字化的时代&#xff0c;公司仍然沿用古老的…

鸿蒙应用开发-初见:入门知识、应用模型

基础知识 Stage模型应用程序包结构 开发并打包完成后的App的程序包结构如图 开发者通过DevEco Studio把应用程序编译为一个或者多个.hap后缀的文件&#xff0c;即HAP一个应用中的.hap文件合在一起称为一个Bundle&#xff0c;bundleName是应用的唯一标识 需要特别说明的是&…

【数据中台】开源项目(2)-Davinci可视应用平台

1 平台介绍 Davinci 是一个 DVaaS&#xff08;Data Visualization as a Service&#xff09;平台解决方案&#xff0c;面向业务人员/数据工程师/数据分析师/数据科学家&#xff0c;致力于提供一站式数据可视化解决方案。既可作为公有云/私有云独立部署使用&#xff0c;也可作为…

Docker配置Halo搭建个人博客-快速入门

Docker配置Halo搭建个人博客-快速入门 1 官方文档2 安装Halo2.1 创建Halo主目录2.2 远程下载配置文件2.3 编辑配置文件2.4 拉取最新镜像2.6 查看容器2.7 开放服务器的防火墙 3 运行3.1 运行项目3.2 停止项目 4 常见问题4.1 没有权限4.2 ommand netstart not found, did you mea…

5种方法,教你如何清理接口测试后的测试数据!

在接口测试之后&#xff0c;清理测试数据是一个很重要的步骤&#xff0c;以确保下一次测试的准确性和一致性。以下是一些常见的测试数据清理方法&#xff1a; 1. 手动清理&#xff1a; 这是最基本的方法&#xff0c;即手动删除或重置测试数据。您可以通过访问数据库、控制台或…

打破障碍:克服数字化应用挑战的策略

通过正确的方法&#xff0c;企业可以成功地克服复杂性&#xff0c;并从数字化中获益。 数字技术的出现彻底改变了我们的生活和工作方式。从智能手机到社交媒体&#xff0c;数字工具在我们的日常生活中无处不在。对于许多个人和组织而言&#xff0c;采用数字技术可能是一个重大…

Java HashMap

HashMap 是 Map 接口中基于哈希表的非同步实现, 自身也可以自动扩容。使用时可以通过 key 快速定位到对应的 value。key 和 value 同时可以都为 null。 1 HashMap 的结构定义 JDK1.8 对 HashMap 进行了比较大的优化, 底层实现由之前的 “数组 链表” 改为 “数组 链表 红黑…

怎么解决 申请获取你的手机号,但该功能使用次数已达当前小程序上限,暂时无法使用。

微信出新规了&#xff0c; 获取手机号数据需要收费&#xff0c;1分钱一条。 在以前的开发中&#xff0c;获取手机号是默认不需要收费的&#xff0c;现在收费等于微信现在作为运营商一样&#xff0c;验证一个手机短信&#xff0c;需要收费 几分钱。 如果你的程序遇到了问题&am…

面试题:说一下你对 OAuth2 协议原理的理解?

文章目录 OAuth2简介角色流程客服端注册Client Type四种授权模式授权码模式隐藏式密码式凭证式RefreshToken OAuth2简介 OAuth 是一个开放授权协议标准&#xff0c;允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息&#xff0c;而不需要将用户名和密码提供给第三…

Python爬虫之代理IP与访问控制

目录 前言 一、代理IP 1.1.使用代理IP的步骤 1.2.寻找可用的代理IP 1.3.设置代理IP 1.4.验证代理IP的可用性 二、访问控制 2.1.遵守Robots协议 2.2.设置访问时间间隔 2.3.多线程爬取 总结 前言 在进行Python爬虫过程中&#xff0c;代理IP与访问控制是我们经常需要处…

11.盛最多的水的容器

一、题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 题目难度&#xff1a;中等 示例&a…

为什么API管理工具对开发人员有益?

应用程序编程接口 &#xff08;API&#xff09; 用于在应用程序之间创建连接&#xff0c;以允许它们相互通信。这种连接是当今数字世界运作方式不可或缺的一部分。实际上&#xff0c;API 使企业能够集成系统&#xff0c;通过创新提供更好的服务和产品。 这就是为什么在 IT 内部…

C语言常见算法

算法&#xff08;Algorithm&#xff09;&#xff1a;计算机解题的基本思想方法和步骤。算法的描述&#xff1a;是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述&#xff0c;包括需要什么数据&#xff08;输入什么数据、输出什么结果&#xff09;、采用什么结构、使…