js中for-in和for-of的区别

文章目录

  • 一、介绍
    • 1.1、`for-in`
    • 1.2、`for-of`
  • 二、区别
    • 2.1、迭代对象的内容不同
    • 2.2、迭代对象的类型不同
    • 2.3、迭代对象的顺序不同
    • 2.4、迭代对象的原理不同
  • 三、联系
  • 四、如何选择合适的循环方法
  • 五、总结
  • 六、最后

一、介绍

JavaScript中,for-infor-of 是两种不同的循环结构,它们有一些重要的区别和联系。

1.1、for-in

for-in 循环用于遍历对象的可枚举属性。

语法如下:

for (variable in object) {// 循环体
}

在这个循环中,variable 是我们定义的属性名,object 是我们要遍历的对象。

这个循环会遍历对象的所有可枚举属性(包括它的原型链上的属性),并且属性名的顺序是不确定的。

例如:

如果我们有一个对象 obj,它包含属性 abc,我们可以使用 for-in 循环来遍历这些属性:

let obj = { a: 1, b: 2, c: 3 };  
for (let key in obj) {  console.log(key); // 输出 'a', 'b', 'c' (但顺序可能每次不同)  
}

需要注意的是,for-in 不仅会遍历对象的自身属性,还会遍历它的原型链上的属性。

如果你只想遍历对象的自身属性,可以使用 Object.keys() 方法来获取对象的所有键名,然后使用 for-of 循环来遍历这些键名对应的值。

1.2、for-of

for-of 循环用于遍历可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments对象等等)。

语法如下:

for (value of iterable) {// 循环体
}

在这个循环中,value 是当前迭代到的元素,iterable 是我们要遍历的可迭代对象。

这个循环会按照特定的顺序遍历对象的每一个元素。

例如:

let arr = [1, 2, 3];
for (let value of arr) {console.log(value); // 输出 '1', '2', '3' (按照数组顺序)
}

二、区别

  • for-in 是用于遍历对象的属性, for-of 是用于遍历可迭代对象的元素
  • for-in 会遍历对象的原型链, for-of 则不会

具体而言:

2.1、迭代对象的内容不同

for-in 循环迭代对象的是键名,而 for-of 循环迭代对象的是值。

for-in 循环适用于迭代对象的键名,而 for-of 循环适用于迭代对象的值。

2.2、迭代对象的类型不同

for-in 循环适用于遍历对象,包括普通对象、数组、函数等

for-of 循环适用于遍历可迭代对象,包括数组、字符串、MapSetTypedArray 等。

2.3、迭代对象的顺序不同

for-in 循环的迭代顺序是不确定的,因为对象的属性没有固定的顺序。

for-of 循环的迭代顺序是确定的,因为可迭代对象的值是按照一定顺序排列的。

2.4、迭代对象的原理不同

for-in 循环遍历对象时,会遍历对象的原型链,并且会包含从原型链继承的属性。

for-of 循环遍历的对象是可迭代对象,它们的值是可枚举的。

三、联系

  • 虽然它们的应用场景不同,但它们都提供了一种方便的方式来遍历一个集合的元素。
  • 在某些情况下,它们也可以互相替代。

例如

如果你有一个对象数组,你可以使用 for-of 来遍历数组中的每个对象。

同样,如果你有一个包含键值对的对象,你可以使用 for-in 来遍历这些键值对。

四、如何选择合适的循环方法

在选择使用 for-in 循环还是 for-of 循环时,我们需要考虑对象的类型以及我们需要迭代的内容。

通常,如果我们需要迭代对象的键名,我们可以使用 for-in 循环;如果我们需要迭代对象的值,我们可以使用 for-of 循环。

另外,当我们需要遍历数组或字符串时,我们可以使用 for-of 循环,因为它可以提供更好的性能和可读性。相比之下,for-in 循环会遍历对象的原型链,会导致性能下降。

如果我们需要遍历一个对象,同时又需要过滤掉从原型链继承的属性,我们可以使用 hasOwnProperty 方法进行过滤。

例如:

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

五、总结

for-in 循环和 for-of 循环是 JavaScript 中用于迭代对象的两种方法。

它们的区别在于 迭代对象的内容、类型、顺序和原理

通常,我们应该根据需要选择合适的循环方法,以提高效的迭代对象。

同时,我们也需要注意到 for-in 循环的一些缺陷

由于它会遍历对象的原型链,导致性能下降,而且不能保证迭代顺序,所以我们 应该避免在数组和字符串上使用 for-in 循环

最后,我们还可以使用其他一些方法来迭代对象,

例如 forEach 方法、map 方法、reduce 方法等。

这些方法不仅可以提供更好的性能和可读性,还可以通过回调函数来实现更加灵活的操作。

总的来说,for-in 循环和 for-of 循环都是 JavaScript 中用于迭代对象的重要方法。

我们需要根据对象的类型和需要迭代的内容来选择合适的循环方法,以提高代码的性能和可读性。

同时,我们也需要注意 for-in 循环的缺陷,并且学会使用其他方法来迭代对象,以实现更加灵活和高效的操作。

六、最后

本人每篇文章都是一字一句码出来,希望对大家有所帮助,多提提意见。顺手来个三连击,点赞👍收藏💖关注✨,一起加油☕

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

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

相关文章

Spring Boot入门指南

本文为官方文档直译版本。原文链接 Spring Boot入门指南 引言Spring Boot 简介系统要求Servlet 容器GraalVM 原生镜像 安装 Spring BootJava 开发人员安装说明安装 Maven安装 Gradle 安装 Spring Boot CLI手动安装使用 SDKMAN 安装!使用 OSX Homebrew 安装使用 MacP…

详细教程 - 从零开发 Vue 鸿蒙harmonyOS应用 第六节(js版) ——模块化设计实现复杂页面

随着HarmonyOS生态的日渐完善,越来越多的厂商加入鸿蒙系统应用开发的行列。然而从其他系统转到鸿蒙开发,很多开发者还是需要一个适应的过程,特别是面对比较复杂的页面,应该如何合理进行模块化拆分是一个难点。 本文将通过一个实例,来分析如果采用模块化的方式实现一个包含丰富内…

Flink系列之:Table API Connectors之JSON Format

Flink系列之:Table API Connectors之JSON Format 一、JSON Format二、依赖三、创建一张基于 JSON Format 的表四、Format 参数五、数据类型映射关系 一、JSON Format JSON Format 能读写 JSON 格式的数据。当前,JSON schema 是从 table schema 中自动推…

微服务组件Gateway的学习

Gateway Gateway基础概念Gateway简单使用Gateway路由工厂Gateway过滤器Gateway跨域配置 Gateway基础概念 API网关指系统的统一入口,它封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑,可以在这…

WTN6系列语音芯片:PWM与DAC音频输出在PCB设计中的优势

随着科技的飞速发展,语音芯片在电子产品中的应用越来越广泛。其中,唯创知音的WTN6系列语音芯片凭借其卓越的性能和多样的功能,受到了市场的热烈欢迎。特别是其支持PWM和DAC两种音频输出方式的特点,使得工程师在PCB设计时能够更加灵…

【个人版】SpringBoot下Spring-Security自定义落地篇【四】

SpringBoot Spring-Security 背景: 上篇文章在源码读取的基础上,根据自身代码习惯及需求,总结了一个自定义简单落地版本。后来在看到松哥写的博文(不太爱看官网),发现还有新的变种模式,虽然整…

mysql使用全文索引+ngram全文解析器进行全文检索

表结构:表名 gamedb 主键 id 问题类型 type 问题 issue 答案 answer 需求 现在有个游戏资料库储存在mysql中,客户端进行搜索,需要对三个字段进行匹配,得到三个字段的相关性,选出三个字段中相关性最大的值进…

【MYSQL】-库的操作

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

在Idea中创建基于工件的本地服务

目录 1、创建基于工件的Tomcat服务器: 2、修改名称: 3、修改服务器项: 4、部署项 5、最后记得点右下角的【应用】和【确定】保存。 1、创建基于工件的Tomcat服务器: 运行->编辑配置->【Tomcat服务器】->本地 2、修…

前端框架如何帮助开发者构建应用程序?

目录 前言 1.项目简介 2. 平台特性 2.1 构架特性 2.2 功能特性 3. 整体架构 4. 技术栈 平台的开放性: 平台高拓展性: 5. 基础功能及搭建 5.1 代码生成器 5.2 工作流程 5.3 门户设计 5.4 大屏设计 5.5 报表设计 5.6 第三方登录 5.7 多租…

ceph更换硬盘

ceph -s //检查故障 k8s70132:~$ ceph -scluster:id: d10b3028-b78d-4b23-bacb-ca26c0a35c99health: HEALTH_WARN1 daemons have recently crashedservices:mon: 5 daemons, quorum k8sceph70201,k8sceph70202,k8sceph70203,k8sceph70204,k8sceph70205 (age 4d)mgr: k8sc…

vscode 同步插件

vscode 扩展商店链接 https://marketplace.visualstudio.com/vscode settings sync 插件

apache shiro 反序列化漏洞解决方案

apache shiro 反序列化漏洞解决方案 反序列化漏洞解决方案产生原因解决方案1:1.升级shiro至最新版本1.7.1解决方案2:修改rememberMe默认密钥,生成随机密钥。 反序列化漏洞解决方案 反序列化漏洞介绍 序列化:把对象转换为字符串或…

opencv、pillow和matplotlib的区别

参考文章:Python学习小技巧——opencv、pillow和matplotlib的区别_pillow和opencv区别-CSDN博客 1 概念的比较: opencv (1)默认不支持中文文件名 (2)数据为numpy,维度:高&#xff…

每日一练,蓝桥杯

蓝桥杯---链表类型题: 小王子排序 这一题要求用到单项列表来解决。也可以使用跨行接受解决,事不宜迟,直接上代码。 第一个,我使用的是链表法解决问题。 一.创建链表。 class Node:def __init__(self,data):self.data datase…

图片速览 PoseGPT:基于量化的 3D 人体运动生成和预测(VQVAE)

papercodehttps://arxiv.org/pdf/2210.10542.pdfhttps://europe.naverlabs.com/research/computer-vision/posegpt/ 方法 将动作压缩到离散空间。使用GPT类的模型预测未来动作的离散索引。使用解码器解码动作得到输出。 效果 提出的方法在HumanAct12(一个标准但小规…

AWS-WAF-CDN基于速率rate的永久黑名单方案(基于lambda实现)

参考方案(有坑), 所以产生了这篇博客: 点击跳转 1. 部署waf (有则跳过) 必须存在一个rate速率规则,后面的方案堆栈要用 新建rate速率规则 关联cdn资源 2.部署堆栈 (美国东部 (弗吉尼亚北部 …

短视频账号剪辑矩阵系统源码技术3年自研开发框架

短视频账号剪辑矩阵系统源码技术3年自研开发框架,这个市场截至到现在基本上违规开发的,没有正规接口开发的,基本上都已经筛选完了,目前各位技术者公司想要考察的话,只需要甄别3方面即可 1.剪辑是不是自己核心研发的&a…

正则表达式:简化模式匹配的利器

正则表达式:简化模式匹配的利器 一、正则表达式简介1.1 正则表达式介绍1.2 正则表达式使用场景 二、正则表达式语法2.1 正则表达式元字符和特性2.2 正则表达式常用匹配 三、正则表达式实战3.1 常见的正则表达式用法3.2 正则表达式的过滤用法3.3 正则表达式的代码用法…

Hadoop Single Node Cluster的安装

Hadoop Single Node Cluster的安装 安装JDK查看java -version更新本地软件包安装JDK查看java安装位置 设置SSH无密码登录安装hadoop下载安装设置hadoop环境变量修改hadoop配置设置文件设置core-site.xml设置YARN-site.xml设置mapred-site.xml设置HDFS分布式文件系统创建并格式化…