【JS】for-in 和 for-of遍历对象的区别

news2024/12/27 18:18:39

【介绍】

for-infor-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-infor-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. 数字键'1', '2', '3')按数值顺序排列,先输出数字键。
  2. 字符串键'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 还会遍历继承自原型链上的属性,因此需要特别注意过滤掉继承的属性。

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

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

相关文章

E-commerce .net+React(一)——项目初始化

文章目录 项目地址一、创建.Net环境1.1环境配置1.1.1 使用vscode创建webapi1.1.2 Clean architecture结构创建1.1.3 将创建好结构的项目添加到git里1.1.4 EF Core配置1. 在infrastructure里安装EF所需环境2. 创建Product数据模型3. 创建EF Core的DbContext 数据库上下文4. 创建…

农家乐系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

NIPS2014 | GAN: 生成对抗网络

Generative Adversarial Nets 摘要-Abstract引言-Introduction相关工作-Related Work对抗网络-Adversarial Nets理论结果-Theoretical Results实验-Experiments优势和不足-Advantages and disadvantages缺点优点 结论及未来工作-Conclusions and future work研究总结未来研究方…

《战神:诸神黄昏》游戏运行时提示找不到emp.dll怎么办?emp.dll丢失如何修复?

《战神:诸神黄昏》游戏运行时提示找不到emp.dll怎么办?emp.dll丢失的修复方法 在畅游《战神:诸神黄昏》这款史诗级游戏的过程中,如果突然遭遇“找不到emp.dll”的错误提示,无疑会打断你的冒险之旅。作为一名深耕软件开…

笔记本通过HDMI转VGA线连接戴尔显示器,wifi不可用或网速变慢

早上开开心心的来使用我的分屏显示器,结果winP开拓展,我的wifi就断掉了,琢磨了好一阵我以为是wifi的问题,发现不进行拓展,网络又好了,一上午就研究这个了,说是hdmi信号干扰了wifi信号啥的额&…

【MATLAB第110期】#保姆级教学 | 基于MATLAB的PAWN全局敏感性分析方法(无目标函数)含特征变量置信区间分析

【MATLAB第110期】#保姆级教学 | 基于MATLAB的PAWN全局敏感性分析方法(无目标函数)含特征变量置信区间分析 一、介绍 PAWN(Probabilistic Analysis With Numerical Uncertainties)是一种基于密度的全局敏感性分析(Gl…

BiTCN-BiGRU基于双向时间卷积网络结合双向门控循环单元的数据多特征分类预测(多输入单输出)

Matlab实现BiTCN-BiGRU基于双向时间卷积网络结合双向门控循环单元的数据多特征分类预测(多输入单输出) 目录 Matlab实现BiTCN-BiGRU基于双向时间卷积网络结合双向门控循环单元的数据多特征分类预测(多输入单输出)分类效果基本描述…

python: Oracle Stored Procedure query table

oracel sql script CREATE OR REPLACE PROCEDURE SelectSchool(paramSchoolId IN char,p_cursor OUT SYS_REFCURSOR ) AS BEGINOPEN p_cursor FORSELECT *FROM SchoolWHERE SchoolId paramSchoolId; END SelectSchool; /-- 查询所有 CREATE OR REPLACE PROCEDURE SelectScho…

软件老化分析

软件老化 课程:软件质量分析 作业 解答 Python代码如下: n int(input("类别数:")) theta list(map(float, input("各个类别的权重:").split())) m list(map(int, input("各个类别的度量元数量&…

cesium通过经纬度获取3dtiles 得feature信息

找到这里3dtiles的两种访问方式: 1.1 3DTileContent#getFeature 这里涉及3DTile 数据结构,暂不了解3DTile 数据结构,因此暂不使用。 1.2 scene.pick 本次使用 scene表示虚拟场景中所有 3D 图形对象和状态的容器;scene中…

【Lua之·Lua与C/C++交互·Lua CAPI访问栈操作】

系列文章目录 文章目录 前言一、概述1.1 Lua堆栈 二、栈操作2.1 基本的栈操作2.2 入栈操作函数2.3 出栈操作函数2.4 既入栈又出栈的操作函数2.5 栈检查与类型转换函数2.5 获取表数据 三、实例演示总结 前言 Lua是一种轻量级的、高性能的脚本语言,经常被用于游戏开发…

Linux -- 生产消费模型

目录 概念 代码 BlockQueue.hpp 代码: 伪唤醒!! Thread.hpp 代码: Task.hpp 代码: test.cc 代码: 再次理解 概念 生产消费模型,也称为生产者-消费者问题,是计算机科学中的一…

DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(1)

DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(1) 架构 架构图 本设计方案的目标是在一台阿里云ECS服务器上搭建一个轻量级的Kubernetes服务k3s节点,并基于Argo搭建一套完整的DevOps CI/CD服务平台,包括Argo CD…

React 第二十节 useRef 用途使用技巧注意事项详解

简述 useRef 用于操作不需要在视图上渲染的属性数据,用于访问真实的DOM节点,或者React组件的实例对象,允许直接操作DOM元素或者是组件; 写法 const inpRef useRef(params)参数: useRef(params),接收的 …

【2024最新】基于Python+Mysql+django的水果销售系统Lw+PPT

作者:计算机搬砖家 开发技术:SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:Java精选实战项…

利用Java爬虫速卖通按关键字搜索AliExpress商品

在这个信息爆炸的时代,数据的价值日益凸显。对于电商领域的从业者来说,能够快速获取商品信息成为了一项重要的技能。速卖通(AliExpress)作为全球领先的跨境电商平台,拥有海量的商品数据。本文将介绍如何使用Java语言编…

动态规划<五> 子数组问题(含对应LeetcodeOJ题)

目录 引例 经典LeetcodeOJ题 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 6.第六题 7.第七题 引例 OJ传送门 Leetcode<53> 最大子数组和 画图分析: 使用动态规划解决 1.状态表示 dp[i]表示以i位置为结尾的所有子数组中的最大和 2.状态转移方程 子数组的问题可以…

前端实现PDF预览的几种选择(pdfjs-dist、react-pdf、pdf-viewer)

记录 PDF预览的选型 对于浏览器自带的PDF预览 如果能直接使用&#xff0c;那自然最好不过了&#xff0c;但考虑多种因素&#xff0c;比如权限问题&#xff0c;禁止用户去下载PDF、预览样式不统一&#xff08;不同浏览器PDF预览的实现不同&#xff09;&#xff0c;所有最终放弃…

小米路由器开启SSH,配置阿里云ddns,开启外网访问SSH和WEB管理界面

文章目录 前言一、开启SSH二、配置阿里云ddns1.准备工作2.创建ddns脚本3.添加定时任务 三、开启外网访问SSH和WEB管理界面1、解除WEB管理页面访问限制2.手动添加防火墙端口转发规则&#xff0c;开启外网访问WEB管理和SSH 前言 例如&#xff1a;随着人工智能的不断发展&#xf…

机器学习(三)-多项式线性回归

文章目录 1. 多项式回归理论2. python通过多项式线性回归预测房价2.1 预测数据2.2导入标准库2.3 导入数据2.4 划分数据集2.5 构建二次多项式特征&#xff08;1, x, x^2&#xff09;2.6 导入线性回归模块2.7 对测试集进行预测2.8 计算均方误差 J2.9 计算参数 w0、w1、w22.10 可视…