【面试题】for...in 和 for...of 的区别

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

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

地址:web前端面试题库

JavaScript 是一门强大而灵活的编程语言,提供了多种迭代对象的方式。两个常见的迭代方式是 for...in 和 for...of 循环。这两种循环用于遍历对象和数组中的元素,但它们有许多重要的区别和适用场景。在本文中,我们将深入探讨 for...in 和 for...of 循环的区别,以及何时使用它们。

1. for...in 循环

for...in 循环是一种用于遍历对象的属性的迭代方式。它的语法结构如下:

for (const key in object) {// 执行代码
}

1.1 遍历对象属性

for...in 循环主要用于遍历对象的属性,它会将对象的每个可枚举属性作为迭代变量 key 的值。

const person = {name: 'John',age: 30,city: 'New York'
};for (const key in person) {console.log(key, person[key]);
}

在上面的示例中,for...in 循环遍历了 person 对象的属性,并打印了每个属性的名称和值。

1.2 遍历原型链属性

for...in 循环不仅会遍历对象自身的属性,还会遍历其原型链上的属性。这可能会导致意外的结果,因为你可能会获取到不是你期望的属性。

function Person(name) {this.name = name;
}Person.prototype.age = 30;const john = new Person('John');for (const key in john) {console.log(key, john[key]);
}

在上面的示例中,for...in 循环不仅遍历了 john 对象自身的属性(name),还遍历了其原型链上的属性(age)。

1.3 按照随机顺序

for...in 循环不保证按照属性的顺序进行迭代。属性的顺序可能是随机的,这取决于 JavaScript 引擎的实现。

const colors = {a: 'red',b: 'green',c: 'blue'
};for (const key in colors) {console.log(key, colors[key]);
}

在上面的示例中,属性的遍历顺序可能是 bac 或其他随机顺序。

1.4 不能直接访问属性值

在 for...in 循环中,你需要通过属性的名称来访问属性的值,这可能会使代码看起来更加冗长。

const person = {name: 'John',age: 30,
};for (const key in person) {const value = person[key];console.log(key, value);
}

在上面的示例中,我们需要使用 person[key] 来访问属性值,而不能直接访问。

2. for...of 循环

for...of 循环是一种用于遍历可迭代对象(如数组、字符串、Map、Set 等)的迭代方式。它的语法结构如下:

for (const element of iterable) {// 执行代码
}

2.1 遍历数组元素

for...of 循环非常适合遍历数组中的元素,它会将数组的每个元素作为迭代变量 element 的值。

const numbers = [1, 2, 3, 4, 5];for (const num of numbers) {console.log(num);
}

在上面的示例中,for...of 循环遍历了 numbers 数组的元素,并打印了每个元素的值。

2.2 不遍历对象属性

与 for...in 循环不同,for...of 循环不会遍历对象的属性,它专门用于遍历可迭代对象。如果你尝试将对象用于 for...of 循环,将会得到错误。

const person = {name: 'John',age: 30,
};for (const value of person) {console.log(value);
}
// TypeError: person is not iterable

在上面的示例中,尝试遍历 person 对象会导致类型错误,因为对象不是可迭代的。

2.3 按照顺序迭代

for...of 循环保证按照对象中元素的顺序进行迭代。这意味着遍历数组时会按照数组的顺序进行,不会出现随机顺序的情况。

const colors = ['red', 'green', 'blue'];for (const color of colors) {console.log(color);
}

在上面的示例中,属性的遍历顺序是 redgreenblue

2.4 直接访问元素值

在 for...of 循环中,你可以直接访问可迭代对象的元素值,而不需要使用索引或属性名称。

const numbers = [1, 2, 3, 4, 5];for (const num of numbers) {console.log(num);
}

在上面的示例中,我们可以直接访问 num 变量来获取数组元素的值,而不需要使用 numbers[num]

4. 总结

for...in 和 for...of 循环都是 JavaScript 中用于迭代的有用工具,但它们有不同的用途和适用场景。了解它们的区别可以帮助你更好地选择合适的迭代方式。

  • 使用 for...in 循环遍历对象的属性,但要注意遍历原型链上的属性。
  • 使用 for...of 循环遍历可迭代对象的元素,例如数组、字符串、Map、Set 等,它更直观且不会遍历原型链属性。

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

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

地址:web前端面试题库

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

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

相关文章

Boost获取当前时间并格式化为字符串

格式化为字符串 时间转字符串有两种方法 #include <boost/date_time/posix_time/posix_time.hpp> #include <iostream>std::string getCurrentTime() {boost::posix_time::ptime currentTime boost::posix_time::microsec_clock::local_time(); std::string …

centos 安装k8s教程(一键安装k8s)

第一步 准备几台机器 第二步 K8s Manager 服务器中添加docker支持 安装教程请查看这个博客 docker 安装详细教程 点我 第三步安装 KuboardSpray 教程在这里 第四步 下载k8s资源包 第五步 安装k8s 点击安装后 显示如下&#xff1a;等待完成

arduino入门一:点亮第一个led

void setup() { pinMode(12, OUTPUT);//12引脚设置为输出模式 } void loop() { digitalWrite(12, HIGH);//设置12引脚为高电平 delay(1000);//延迟1000毫秒&#xff08;1秒&#xff09; digitalWrite(12, LOW);//设置12引脚为低电平 delay(1000); }

电脑桌面便签工具选择哪一款?

随着互联网时代的不断发展&#xff0c;电脑成为日常工作及办公中必不可少的工具&#xff0c;通过电脑这款工具&#xff0c;大家可以更好的进行工作、学习等方面的交流&#xff1b;电脑桌面便签由于可以为大家整合一些工作及学习方面的备忘事项及笔记等&#xff0c;因而深受大家…

获取验证码在倒计时未完成前清除验证码

场景&#xff1a; 在点击获取验证码后&#xff0c;验证码开始倒计时&#xff0c;在点击登录后&#xff0c;出现弹窗不跳转页面。因此在出现弹窗后&#xff0c;即使倒计时没有结束&#xff0c;也要将倒计时的文字变为重新获取验证码。 template代码 <div class"form-b…

【Vue】Node.js的下载安装与配置

目录 一.下载安装 官网&#xff1a; 二.环境变量的配置 三.设置全局路径和缓存路径 四.配置淘宝镜像 五.查看配置 六.使用npm安装cnpm ​ 一.下载安装 官网&#xff1a; https://nodejs.org/en/download 下载完之后&#xff0c;安装的时候一直点next即可&#xff0c…

FlinkCDC实现主数据与各业务系统数据的一致性(瀚高、TIDB)

文章末尾附有flinkcdc对应瀚高数据库flink-cdc-connector代码下载地址 1、业务需求 目前项目有主数据系统和N个业务系统,为保障“一数一源”,各业务系统表涉及到主数据系统的字段都需用主数据系统表中的字段进行实时覆盖,这里以某个业务系统的一张表举例说明:业务系统表Ta…

BQL是什么如何使用?

BQL是什么如何使用&#xff1f; BQL来源于Business Query Language &#xff0c;是一种业务查询语言。是北京硕迪制信科技有限公司根据以往统计分析案例研发的一种语言。特点是通过可视化界面对业务语言进行查询、聚合、排序等操作&#xff0c;通过BQL引擎转换为数据库可执行的…

CSGO游戏搬砖市场下跌分析,是跑还是入?

CSGO市场下跌分析&#xff0c;是跑还是入&#xff1f; 以下所有都是阿阳本人最近几年观察市场和踩坑的一点经验&#xff0c;由于篇幅不长所以肯定会很浅薄&#xff0c;大伙下嘴轻点 。 首先现在真的是CSGO市场最低点吗&#xff1f;后续还会跌吗&#xff1f;我们究竟是该继续观…

Course1-Week1:机器学习简介

Course1-Week1&#xff1a;机器学习简介 文章目录 Course1-Week1&#xff1a;机器学习简介1. 课程简介1.1 课程大纲1.2 Optional Lab的使用 (Jupyter Notebooks)1.3 欢迎参加《机器学习》课程 2. 机器学习简介2.1 机器学习定义2.2 有监督学习2.3 无监督学习 3. 线性回归模型3.1…

golang学习笔记——使用映射

文章目录 使用映射声明和初始化映射添加项访问项删除项映射中的循环 使用映射 Go 中的映射是一个哈希表&#xff0c;是键值对的集合。 映射中所有的键都必须具有相同的类型&#xff0c;它们的值也是如此。 不过&#xff0c;可对键和值使用不同的类型。 例如&#xff0c;键可以…

Apach Ozone部署

前言 最近由于工作需要&#xff0c;要部署一套ozone。我自己对hadoop这套体系不是很熟悉&#xff0c;所以过程磕磕碰碰&#xff0c;好不容易勉强搭起来&#xff0c;所以记录一下部署方式 准备 三台主机&#xff0c;主机均已安装jdk、hdfs&#xff0c;相关的安装配置就不另外写…

python二叉树链树_树的链式存储结构

二叉链树是一种树状数据结构&#xff0c;其中每个节点最多有两个子节点&#xff0c;分别称为左子节点和右子节点。每个节点包含一个数据元素和指向其左右子节点的指针。二叉链树可以是空树&#xff0c;也可以是具有以下特点的非空树&#xff1a; 1. 每个节点最多有两个子节点。…

netstat

netstat 命令用于显示网络状态 参数说明&#xff1a; -a或--all 显示所有连线中的Socket&#xff0c;默认不显示LISTEN相关 -n 拒绝显示别名&#xff0c;能显示数字的全部转化成数字 -e或--extend 显示网络扩展信息(User&#xff0c;Inode) -p或--programs 显示正在使用So…

计算机组成原理 the one day

1.计算机系统硬件软件 cpu运算器控制器 1个字&#xff08;word&#xff09;16bit&#xff1b; difference 1个字节&#xff08;Byte&#xff09;bit&#xff1b; 2.cpu主频&#xff08;时钟频率&#xff09;1/cpu时钟周期 CPI执行一条指令所需的时间周期数。 执行一条程序的…

JavaEE 多线程01

为什么引入多线程? 首先进程已经能很好的完成多任务这个情景下的并发编程了,那为什么又引入多线程呢? 这是因为在一些情景下,我么需要大量的创建和销毁进程来完成一些任务,此时多进程对系统的开销就会很大了. 假设有这样一个场景,服务器同时接收到很多个服务请求,这个时候服务…

Python基础教程: sorted 函数

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 sorted 可以对所有可迭代的对象进行排序操作&#xff0c; sorted 方法返回的是一个新的 list&#xff0c;而不是在原来的基础上进行的操作。 从新排序列表。 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程…

taro h5 ios解决input不能自动获取焦点拉起键盘

描述&#xff1a;页面中有个按钮&#xff0c;点击跳转到第二个页面&#xff08;有input&#xff09;&#xff0c;能直接获取焦点拉起键盘输入 安卓&#xff1a; 直接用focus() ios&#xff1a; focus无效&#xff0c;必须手动拉起 原理&#xff1a; 点击按钮的时候拉起一…

一元三次方程求解——浮点数二分

题目描述 思路 根与根之差的绝对值>1。可以得出距离为1的区间最多只有一个根若存在2个数x1和x2&#xff0c;且x1 < x2&#xff0c;f(x1) x f(x2) < 0&#xff0c;则(x1, x2)之间一定有一个根我们可以遍历每一个区间为1的范围&#xff0c;先判断左端点是否是根&#x…

K8s client go 创建CRD的informer

背景 需要监听K8s中CRD资源的变动, 做出相应的处理, 需要针对 CRD资源建立informer 实现 dynamicClient 是 创建的K8s的client, 这里使用的是 Unstructured 接収的CRD的结果, 加工的时候使用了convertUnstructuredProject 加工了一下, convertUnstructuredProject 实现下面提…