JS中的for...in和for...of有什么区别?

你好,我是沐爸,欢迎点赞、收藏、评论和关注。

在 JavaScript 中,for...infor...of 是两种用于遍历数组(或其他可迭代对象)的循环语句,但它们之间存在显著的差异。

一、遍历数组

for…in

const arr = ['apple', 'banana', 'cherry']for (const index in arr) {console.log(index, arr[index])
}
// 0 apple
// 1 banana
// 2 cherry

遍历数组的索引,访问数组元素通过 arr[index]形式。

for…of

const arr = ['apple', 'banana', 'cherry']for (const value of arr) {console.log(value)
}
// apple
// banana
// cherry

遍历数组元素,不能访问索引

二、遍历对象

for...in
const obj = {name: '张三',age: 20
}for (const key in obj) {console.log(key, obj[key])
}
// name 张三
// age 20

遍历对象的键(key),通过obj[key]访问属性的值。

for…of

const obj = {name: '张三',age: 20
}for (const key of obj) {console.log(key)
}
// TypeError: obj is not iterable

for...of 循环默认并不支持直接遍历对象的属性。因为for...of循环是为可迭代对象(如Array, Map, Set, arguments等)设计的,这些对象都有一个[Symbol.iterator]方法。

所以,常见的做法是结合 Object.keys()Object.values或者Object.entries() 进行遍历。

const obj = {name: '张三',age: 20
}for (const key of Object.keys(obj)) {console.log(key, obj[key])
}
// name 张三
// age 20for (const value of Object.values(obj)) {console.log(value)
}
// 张三
// 20for (const [key, value] of Object.entries(obj)) {console.log(key, value)
}
// name 张三
// age 20

另外,for…in 和 for…of 在遍历对象原型上的属性也有区别,for…in 会遍历对象原型上的属性,for…of 不会。

function Person(name, age) {this.name = namethis.age = age
}Person.prototype.say = function() {console.log('My Name is ' + this.name)
}const obj = new Person('张三', 20)for (const key in obj) {console.log(key, obj[key])
}
// name 张三
// age 20
// say [Function (anonymous)]for (const key of Object.keys(obj)) {console.log(key, obj[key])
}
// name 张三
// age 20

说准确点,并不是 for…of 不会遍历对象原型上的属性,而是 for…of 借助的 Object.keys()Object.valuesObject.entries()方法返回的数组只包含对象自身的属性和值。

如果想让 for…in 跟 for…of 一样只遍历对象自身的属性,可使用 hasOwnProperty

for (const key in obj) {if (obj.hasOwnProperty(key)) {console.log(key, obj[key])}
}

三、遍历其他类型数据

1.字符串
let str = "hello"for (const index in str) {console.log(index, str[index])
}
// 0 h
// 1 e
// 2 l
// 3 l
// 4 ofor (const value of str) {console.log(value)
}
// h
// e
// l
// l
// o

2.Set 结构

const set = new Set(['apple', 'banana', 'cherry'])for (const value in set) {console.log(value) // 这里几乎不会执行任何有用的操作,因为set没有可枚举的属性
}for (const value of set) {console.log(value)
}
// 输出(顺序可能不同,因为Set是无序的):
// apple
// banana
// cherry

3.Map结构

const map = new Map([['a', 1], ['b', 2], ['c', 3]])for (const value in map) {console.log(value) // 这里几乎不会执行任何有用的操作,因为map没有可枚举的属性
}for (const [key, value] of map) {console.log(key, value) 
}
// 输出:  
// a 1  
// b 2  
// c 3

4.类数组arguments

function fn(a, b, c) {for (const index in arguments) {console.log(index, arguments[index])}// 0 zhangsan// 1 20// 2 男for (const value of arguments) {console.log(value)}// zhangsan// 20// 男
}fn('zhangsan', 20, '男')

四、总结

通过以上示例可知,两者主要有以下区别:

  • for...in
    • 遍历对象的可枚举属性(包括原型链上的)
    • 对于数组,遍历的是索引(字符串类型)。
    • 不可遍历 Set 和 Map 结构
  • for...of
    • 遍历可迭代对象的值,直接访问值而不是键名或索引。
    • 不可直接变量对象,需要借助 Object.keys/values/entries。
    • 另外可遍历 Set 和 Map 结构

好了,分享结束,谢谢点赞,下期再见。

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

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

相关文章

[性能]高速收发的TCP/MQTT通信

Nagle算法‌是一种TCP/IP协议中的优化算法,旨在减少小数据包的数量,从而减少网络拥塞的可能性。该算法规定,在一个TCP连接上最多只能有一个未被确认的小分组。当数据被发送后,如果收到确认(ACK)之前&#x…

10 while和unitl循环结构语句

while和unitl循环结构语句 一、循环结构语句 ​ Shell编程中循环命令用于特定条件下决定某些语句重复执行的控制方式,有三种常用的循环语句:for、while和until。while循环和for循环属于“当型循环”,而until属于“直到型循环”。 二、详解…

永磁电机和普通电机优缺点

永磁电机和普通电机(如异步电机或同步电机)各有优缺点,具体如下: 永磁电机 优点: 高效率:由于永磁体提供持续的磁场,永磁电机通常具有更高的效率。 体积小、重量轻:相对于功率&a…

JS实现数组去重常见方法

写在前面 今天在实现数组去重时&#xff0c;使用了多种方法实现。在此总结一下数组去重常见方法。 01_多重for循环去重 let arr [1, 2, 2, 3, 3, 1, 2] // 多层for循环去重 for (let i 0;i < arr.length;i) {for (let j i 1;j < arr.length;j) {if (arr[i] …

OpenCV绘制ROI区域(五)

鼠标绘制矩形 using OpenCvSharp; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _01_绘制矩形 {internal class Program{//宏 常量public static string WINDOW_NAME "程序窗口&qu…

战神5/战神:诸神黄昏/God of War Ragnarok(容量175GB)百度网盘下载

版本介绍 v1.0.612.4312|容量175GB|官方简体中文|支持键盘.鼠标.手柄|赠单板学习补丁 配置要求 战神5/战神&#xff1a;诸神黄昏/God of War Ragnarok 游戏介绍 不灭的北欧传奇 由Santa Monica Studio出品、Jetpack Interactive负责PC移植的佳作《God of War Ragnark》将带您…

【原创】java+swing+mysql仓库管理系统设计与实现

个人主页&#xff1a;程序员杨工 个人简介&#xff1a;从事软件开发多年&#xff0c;前后端均有涉猎&#xff0c;具有丰富的开发经验 博客内容&#xff1a;全栈开发&#xff0c;分享Java、Python、Php、小程序、前后端、数据库经验和实战 文末有本人名片&#xff0c;希望和大家…

SpringBootWeb响应

2. 响应 前面我们学习过HTTL协议的交互方式&#xff1a;请求响应模式&#xff08;有请求就有响应&#xff09; 那么Controller程序呢&#xff0c;除了接收请求外&#xff0c;还可以进行响应。 2.1 ResponseBody 在我们前面所编写的controller方法中&#xff0c;都已经设置了…

目标检测-数据集

目标检测数据集是用于训练、验证和测试目标检测模型的图像和标注数据的集合。这些数据集通常包含多种类别的物体&#xff0c;并提供了每个物体的位置信息&#xff08;即边界框&#xff09;。下面是一些广泛使用的目标检测数据集&#xff0c;以及它们的特点&#xff1a; 1. COC…

【MYSQL】聚合查询、分组查询、联合查询

目录 聚合查询聚合函数count()sum()avg()max()和min()总结 分组查询group by 子句having 子句 联合查询笛卡尔积内连接外连接自连接子查询单行子查询多行子查询from子句使用子查询 合并查询 聚合查询 聚合查询就是针对表中行与行之间的查询。 聚合函数 count() count(列名)&a…

对接阿里asr和Azure asr

1&#xff1a;对接阿里asr 1.1&#xff1a;pom <dependency><groupId>com.alibaba.nls</groupId><artifactId>nls-sdk-recognizer</artifactId><version>2.2.1</version> </dependency>1.2&#xff1a;生成token package c…

【动态规划】两个数组的 dp 问题二

两个数组的 dp 问题 1.正则表达式匹配2.交错字符串3.两个字符串的最小ASCII删除和4.最长重复子数组 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1…

创客匠人对话:创始人IP如何进阶?掌握这三点实现高质量多次转化

我们邀请到老蒋创客圈第67期对话标杆直播连麦&#xff0c;我们邀请到【君儒文化】平台创始人彭君如老师。从去年12月份参加创客匠人的线下大课后&#xff0c;就果断加入陪跑&#xff0c;到今年7月份顺利拿到68w的发售大结果。 前面我们介绍了彭老师的传承、发心愿景&#xff0…

小程序体验版无法正常请求接口,开启 调试可以正常请求

在本地开发工具可以正常访问小程序&#xff0c;上传代码后打开体验版&#xff0c;界面无法请求接口&#xff0c;手机小程序打开调试模式可以正常访问。这可以查看下小程序后台是否设置了服务器域名以及业务域名 然后查看小程序开发工具 - 详情 - 项目配置 重新上传代码&#xf…

vue无感刷新Token并重新请求

vue 拦截器拦截401重新请求Token 无感刷新Token 之后重新请求报401的接口 instance.interceptors.response.use(async (response) > {let { data } response;if (data.code 401 || data.code 403) {return await handleExpiredToken(response.config);}if (data.code ! …

二叉树的层序遍历(含八道leetcode相关题目)

文章目录 二叉树层序遍历模板102. 二叉树的层序遍历107. 二叉树的层序遍历 II199. 二叉树的右视图637. 二叉树的层平均值515. 在每个树行中找最大值429. N 叉树的层序遍历116. 填充每个节点的下一个右侧节点指针117. 填充每个节点的下一个右侧节点指针 II 二叉树层序遍历模板 …

240922-局域网内通过SSH与SFTP访问RHEL服务器

要通过SFTP&#xff08;安全文件传输协议&#xff09;在局域网内访问一台RHEL服务器&#xff0c;您需要确保以下步骤都已经正确完成&#xff1a; A. 在RHEL服务器上配置SFTP服务 RHEL默认通过sshd服务提供SFTP功能&#xff0c;SFTP使用SSH协议进行文件传输&#xff0c;因此需要…

【二等奖论文】2024年华为杯研赛D题成品论文(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 点击链接获取【2024华为杯研赛资料汇总】&#xff1a; https://qm.qq.com/q/jTIeGzwkSchttps://qm.qq.com/q/jTIeGzwkSc 题 目&#xff1a; 大数据驱动的…

如何理解数据资产?

1.数据分类 对于企业来说&#xff0c;数据的产出创建、应用和管理无处不在。而在使用数据的前提下是必须了解数据&#xff0c;常见的企业数据分为三大类&#xff1a;主数据、业务数据及分析数据。 主数据&#xff1a;企业中的“黄金数据”&#xff0c;它用来承载业务数据和分析…

基于Ambari搭建hadoop生态圈+Centos7安装教程(还没写完,等明天补充完整)

当我们学习搭建hadoop的时候&#xff0c;未免也会遇见很多繁琐的事情&#xff0c;比如很多错误&#xff0c;需要解决。在以后公司&#xff0c;也不可能让你一个一个搭建hadoop&#xff0c;成千上万的电脑&#xff0c;你再一个个搭建&#xff0c;一个个报错&#xff0c;而且每台…