【JS】for-in 和 for-of遍历对象的区别
【介绍】
for-in
和 for-of
都是 JavaScript 中用于遍历数据结构的循环语句,但它们的工作原理和适用场景有所不同。特别是它们在遍历对象时的行为是不同的。
【区别】
for-in
遍历对象
for-in
是用于遍历对象的 可枚举属性的键名(属性名),它会遍历对象自身以及继承的属性(从原型链继承的属性)。这种遍历顺序并不是固定的,因此在遍历时,键名的顺序不一定是按添加顺序排列的。
示例:
const obj = { a: 1, b: 2, c: 3 };for (let key in obj) {console.log(key); // 输出属性名: "a", "b", "c"console.log(obj[key]); // 输出属性值: 1, 2, 3
}
for-in
遍历的是 属性名(键),可以通过obj[key]
获取对应的值。- 它也会遍历继承自原型链的属性。
注意:
for-in
可能遍历到对象的原型链上的属性,因此通常在遍历对象时要使用hasOwnProperty
来过滤掉继承的属性:
for (let key in obj) {if (obj.hasOwnProperty(key)) {console.log(key, obj[key]); // 只输出 obj 自有属性}
}
for-of
遍历对象
for-of
主要用于遍历 可迭代对象(如数组、字符串、Map、Set 等),它可以直接遍历这些对象的 元素值。普通对象(如{}
)不是可迭代对象,因此不能使用for-of
遍历对象。
示例:
const arr = [1, 2, 3, 4];for (let value of arr) {console.log(value); // 输出:1, 2, 3, 4
}
for-of
遍历的是 数组元素的值,并不像for-in
那样遍历键名。
区别总结:
特性 | for-in | for-of |
---|---|---|
遍历目标 | 对象的 属性名(键名) | 可迭代对象的 值 |
适用场景 | 用于遍历对象的属性 | 用于遍历数组、字符串、Set、Map 等可迭代对象的值 |
遍历顺序 | 遍历对象属性的顺序不固定 | 遍历顺序是固定的,按数组的顺序遍历元素 |
遍历对象时的行为 | 遍历对象的所有可枚举属性,包括原型链上的属性 | 不适用于对象,适用于数组等可迭代对象 |
是否遍历原型链 | 会遍历继承的属性 | 不会遍历原型链上的元素 |
对象如何使用 for-of
遍历?
由于普通对象是不可迭代的,不能直接使用 for-of
来遍历对象。如果你希望遍历对象的值或键,可以先使用 Object.keys()
, Object.values()
或 Object.entries()
来将对象转化为可迭代的结构,然后使用 for-of
遍历。
示例:使用 for-of
遍历对象的键和值
const obj = { a: 1, b: 2, c: 3 };// 遍历键
for (let key of Object.keys(obj)) {console.log(key); // 输出:a, b, c
}// 遍历值
for (let value of Object.values(obj)) {console.log(value); // 输出:1, 2, 3
}// 遍历键值对
for (let [key, value] of Object.entries(obj)) {console.log(key, value); // 输出:a 1, b 2, c 3
}
【总结】
for-in
用于遍历 对象的属性名,适合遍历对象本身及其原型链上的属性。for-of
用于遍历 可迭代对象的元素值,常用于遍历数组、字符串、Set 和 Map 等类型。对于普通对象,通常先将对象转化为可迭代的结构后才能使用for-of
。
补充
for-in
遍历对象时属性顺序不固定
在 JavaScript 中,for-in
遍历对象时的属性顺序确实不是固定的。特别是对于对象的 数字类型的键名,浏览器的行为可能会不同,但根据 ECMAScript 规范,对于普通对象来说, 字符串类型的键名会按添加顺序遍历,而数字键名会按数值顺序遍历。
然而,这个顺序并不是严格保证的,尤其是在老版本的浏览器中,可能会出现不同的行为。为了演示这种不固定顺序的行为,我们可以考虑以下代码示例,展示不同类型的键名如何影响 for-in
的遍历顺序。
示例:for-in
遍历顺序
const obj = {'3': 'three', // 数字类型的键'1': 'one', // 数字类型的键'2': 'two', // 数字类型的键'a': 'apple', // 字符串类型的键'b': 'banana', // 字符串类型的键'z': 'zebra' // 字符串类型的键
};for (let key in obj) {console.log(key); // 输出属性名(键)
}
输出:
1
2
3
a
b
z
解释:
- 数字键(
'1'
,'2'
,'3'
)按数值顺序排列,先输出数字键。 - 字符串键(
'a'
,'b'
,'z'
)按添加顺序排列,紧随其后。
示例:for-in
的原型链行为
for-in
不仅会遍历对象本身的属性,还会遍历继承的属性(即原型链上的属性)。因此,如果对象有继承的属性或方法,for-in
会遍历这些继承的属性。
const obj = {name: 'Alice',age: 25
};Object.prototype.sayHello = function() {console.log('Hello!');
};for (let key in obj) {console.log(key); // 输出:name, age, sayHello
}
输出:
name
age
sayHello
解释:
for-in
会遍历 obj
的自有属性和继承的属性,因此 sayHello
也被遍历到。
小结:
for-in
的遍历顺序并不完全固定,尤其是数字类型的键名的顺序可能因不同的 JavaScript 引擎而有所不同。- 对于字符串类型的键,
for-in
通常会按照对象中添加的顺序遍历。 for-in
还会遍历继承自原型链上的属性,因此需要特别注意过滤掉继承的属性。
相关文章:
【JS】for-in 和 for-of遍历对象的区别
【介绍】 for-in 和 for-of 都是 JavaScript 中用于遍历数据结构的循环语句,但它们的工作原理和适用场景有所不同。特别是它们在遍历对象时的行为是不同的。 【区别】 for-in 遍历对象 for-in 是用于遍历对象的 可枚举属性的键名(属性名)…...
【每日学点鸿蒙知识】ets匿名类、获取控件坐标、Web显示iframe标签、软键盘导致上移、改变Text的背景色
1、HarmonyOS ets不支持匿名类吗? 不支持,需要显式标注对象字面量的类型,可以参考以下文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/typescript-to-arkts-migration-guide-V5#%E9%9C%80%E8%A6%81%E6%…...

深度学习blog- 数学基础(全是数学)
矩阵:矩阵是一个二维数组,通常由行和列组成,每个元素可以通过行索引和列索引进行访问。 张量:张量是一个多维数组的抽象概念,可以具有任意数量的维度。除了标量(0D张量)、向量(…...
最后100米配送
1. 项目概述 1.1 项目目标 集成无人机与电动车:设计并实现将无人机固定在电动车上,利用电动车的电源进行飞行,实现高楼内部从电动车位置到用户办公/居住地点的最后100米精准配送。低成本实现:通过利用电动车现有的电源和结构&am…...

Linux的进程替换以及基础IO
进程替换 上一篇草率的讲完了进程地址空间的组成结构和之间的关系,那么我们接下来了解一下程序的替换。 首先,在进程部分我们提过了,其实文件可以在运行时变成进程,而我们使用的Linux软件其实也是一个进程,所以进一步…...
《计算机网络A》单选题-复习题库
1. 计算机网络最突出的优点是(D) A、存储容量大B、将计算机技术与通信技术相结合C、集中计算D、资源共享 2. RIP 路由协议的最大跳数是(C) A、13B、14C、15D、16 3. 下面哪一个网络层次不属于 TCP/IP 体系模型(D&a…...

闲谭Scala(2)--安装与环境配置
1. 概述 Java开发环境安装,需要两步,第一安装JDK,第二配置环境变量。 Scala的话,也是两步,第一安装Scale环境,第二配置环境变量。 需要注意的是,配置环境变量,主要是想让windows操…...

Python基于卷积神经网络的车牌识别系统开发与实现
1. 简介 车牌识别是人工智能在交通领域的重要应用,广泛用于高速违章检测、停车场管理和智能交通系统等场景。本系统通过基于卷积神经网络(CNN)的深度学习算法,结合 Python 和 MySQL 实现车牌的快速识别与管理。 系统特点&#x…...
Spring Boot集成Netty创建一个TCP服务器,接收16进制数据(自定义解码器和编码器)
Netty Netty是一个高性能、异步事件驱动的网络应用程序框架,它提供了对并发和异步编程的抽象,使得开发网络应用程序变得更加简单和高效。 在Netty中,EventLoopGroup是处理I/O操作的多线程事件循环器。在上面的示例中,我们创建了两个EventLoopGroup实例:bossGroup和worker…...
Python 中的 with open:文件操作的最佳实践
在 Python 中,文件操作是最常用的一项任务,无论是读取文件内容,还是将数据写入文件。传统的文件操作方式使用 open() 和 close() 函数来处理文件,但在实际开发中,我们推荐使用 with open() 语句来进行文件操作。本文将…...
哪些框架、软件、中间件使用了netty? 哪些中间件、软件底层使用了epoll?
使用 Netty 的软件、中间件和框架 Netty 是一个异步事件驱动的网络应用框架,广泛应用于构建高性能的网络应用程序。以下是一些使用了 Netty 的知名软件、中间件和框架: 1. Elasticsearch 描述:Elasticsearch 是一个分布式的搜索和分析引擎…...

AI 智能助手对话系统
一个基于 React 和 Tailwind CSS 构建的现代化 AI 对话系统,提供流畅的用户体验和丰富的交互功能。 项目链接:即将开放… 功能特点 🤖 智能对话:支持与 AI 助手实时对话,流式输出回答📁 文件处理ÿ…...

2024年秋词法分析作业(满分25分)
【问题描述】 请根据给定的文法设计并实现词法分析程序,从源程序中识别出单词,记录其单词类别和单词值,输入输出及处理要求如下: (1)数据结构和与语法分析程序的接口请自行定义;类别码需按下表格…...

Docker镜像瘦身:从1.43G到22.4MB
Docker镜像瘦身:从1.43G到22.4MB 背景1、创建项目2、构建第一个镜像3、修改基础镜像4、多级构建5、使用Nginx背景 在使用 Docker 时,镜像大小至关重要。我们从 create-react-app (https://reactjs.org/docs/create-a-new-react-app.html)获得的样板项目通常都超过 1.43 GB…...

前端加解密对抗encrypt-labs
前言 项目地址:https://github.com/SwagXz/encrypt-labs 作者:SwagXz 现在日子越来越不好过了,无论攻防、企业src还是渗透项目,总能看到大量的存在加密的网站,XZ师傅的前端加密靶场还是很值得做一做的,环…...
Android Notification 问题:Invalid notification (no valid small icon)
问题描述与处理策略 1、问题描述 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.notifications/com.my.notifications.MainActivity}: java.lang.IllegalArgumentException: Invalid notification (no valid small icon): Notification(chan…...

Python爬虫教程——7个爬虫小案例(附源码)_爬虫实例
本文介绍了7个Python爬虫小案例,包括爬取豆瓣电影Top250、猫眼电影Top100、全国高校名单、中国天气网、当当网图书、糗事百科段子和新浪微博信息,帮助读者理解并实践Python爬虫基础知识。 包含编程资料、学习路线图、源代码、软件安装包等!【…...

Log4j2的Policies详解、SizeBasedTriggeringPolicy、TimeBasedTriggeringPolicy
文章目录 一、Policies二、SizeBasedTriggeringPolicy:基于文件大小的滚动策略2.1、文件达到指定大小就归档 三、TimeBasedTriggeringPolicy:基于时间间隔的滚动策略3.1、验证秒钟归档场景3.2、验证分钟场景3.3、验证小时场景 四、多策略组合使用五、扩展知识5.1、S…...
ES中查询中参数的解析
目录 query中参数match参数match_allmatch:匹配指定参数match_phrase query中其他的参数query_stringprefix前缀查询:wildcard通配符查询:range范围查询:fuzzy 查询: 组合查询bool参数mustmust_notshould条件 其他参数 query中参数 词条查询term:它仅匹配在给定字段…...

学习笔记:使用 pandas 和 Seaborn 绘制柱状图
学习笔记:使用 pandas 和 Seaborn 绘制柱状图 前言 今天在使用 pandas 对数据进行处理并在 Python 中绘制可视化图表时,遇到了一些关于字体设置和 Seaborn 主题覆盖的小问题。这里将学习到的方法和注意事项做个总结,以便之后的项目中可以快…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

ZYNQ学习记录FPGA(二)Verilog语言
一、Verilog简介 1.1 HDL(Hardware Description language) 在解释HDL之前,先来了解一下数字系统设计的流程:逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端,在这个过程中就需要用到HDL,正文…...

EEG-fNIRS联合成像在跨频率耦合研究中的创新应用
摘要 神经影像技术对医学科学产生了深远的影响,推动了许多神经系统疾病研究的进展并改善了其诊断方法。在此背景下,基于神经血管耦合现象的多模态神经影像方法,通过融合各自优势来提供有关大脑皮层神经活动的互补信息。在这里,本研…...