当前位置:首页 > 科技  > 软件

如何在JavaScript中复制一个对象?

来源: 责编: 时间:2024-04-11 08:58:22 262观看
导读JavaScript的原始数据类型是不可变的,这意味着一旦创建,它们的值就不能改变。但是,对象和数组是可变的,允许在创建后修改它们的值。实际上,这意味着原始数据是通过值传递的,而对象和数组是通过引用传递的。考虑以下例子:let

JavaScript的原始数据类型是不可变的,这意味着一旦创建,它们的值就不能改变。但是,对象和数组是可变的,允许在创建后修改它们的值。BkJ28资讯网——每日最新资讯28at.com

实际上,这意味着原始数据是通过值传递的,而对象和数组是通过引用传递的。考虑以下例子:BkJ28资讯网——每日最新资讯28at.com

let str = 'Hello';let copy = str;copy = 'Hi';// str = 'Hello', copy = 'Hi'let obj = { a: 1, b: 2 };let objCopy = obj;objCopy.b = 4;// obj = { a: 1, b: 4}, objCopy = { a: 1, b: 4 }

你可以看到,对象obj是通过引用传递给objCopy的。修改其中一个变量会影响另一个变量,因为它们都引用同一个对象。那我们如何解决这个问题呢?答案是克隆对象。BkJ28资讯网——每日最新资讯28at.com

浅复制

使用展开运算符(...)或 Object.assign(),我们可以克隆对象并根据其属性创建一个新对象。BkJ28资讯网——每日最新资讯28at.com

const shallowClone = obj => Object.assign({}, obj);let obj = { a: 1, b: 2};let clone = shallowClone(obj);let otherClone = shallowClone(obj);clone.b = 4;otherClone.b = 6;// obj = { a: 1, b: 2}// clone = { a: 1, b: 4 }// otherClone = { a: 1, b: 6 }

这种技术被称为浅复制,因为它适用于外部(浅层)对象,但如果我们有嵌套(深层)对象,则会失败,因为这些对象最终会通过引用传递。这就引出了下一部分。BkJ28资讯网——每日最新资讯28at.com

图片图片BkJ28资讯网——每日最新资讯28at.com

深复制

为了创建一个对象的深复制,我们需要递归地克隆每一个嵌套对象,复制嵌套对象和数组。BkJ28资讯网——每日最新资讯28at.com

网上有一些解决方案使用 JSON.stringify() 和 JSON.parse()。虽然这种方法在某些情况下可能有效,但它包含许多问题和性能问题,因此我建议不要使用它。BkJ28资讯网——每日最新资讯28at.com

从边界情况开始,我们需要检查传递的对象是否为空,如果是,则返回 null。否则,我们可以使用 Object.assign() 和一个空对象 ({}) 来创建原始对象的浅复制。BkJ28资讯网——每日最新资讯28at.com

然后,我们将使用 Object.keys() 和 Array.prototype.forEach() 来确定需要深复制哪些键值对。如果对象是一个数组,我们将设置克隆对象的长度与原对象相等,并使用 Array.from() 创建一个克隆对象。否则,我们将递归地调用函数,把当前值作为参数传入。BkJ28资讯网——每日最新资讯28at.com

深复制专用于简单对象和数组。这意味着它无法处理类实例,函数和其他特殊情况。那么,我们如何处理这些情况呢?JavaScript最近给我们提供了一个新的工具来解决这个问题!BkJ28资讯网——每日最新资讯28at.com

使用 structuredClone() 进行深复制

克隆显然是一个很常见也很重要的问题。事实上,JavaScript引入了structuredClone()全局函数,可以用来深度克隆对象。而我们不需要实现复杂的递归函数,只需使用这个函数就可以克隆对象。BkJ28资讯网——每日最新资讯28at.com

这种技术可用于数组和对象,代码最少,是JavaScript中克隆对象的推荐方式,因为它性能最佳且最可靠。BkJ28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-82737-0.html如何在JavaScript中复制一个对象?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 通过 Atexit 模块让 Python 实现 Golang 的 defer 功能,你学会了吗?

下一篇: 注意:Kafka 的这六个场景会丢失消息!

标签:
  • 热门焦点
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 分布式系统中的CAP理论,面试必问,你理解了嘛?

    对于刚刚接触分布式系统的小伙伴们来说,一提起分布式系统,就感觉高大上,深不可测。而且看了很多书和视频还是一脸懵逼。这篇文章主要使用大白话的方式,带你理解一下分布式系统
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析

    在 Elasticsearch 中,function_score 可以让我们在查询的同时对搜索结果进行自定义评分。function_score 提供了一系列的参数和函数让我们可以根据需求灵活地进行设置。近期
  • 为什么你不应该使用Div作为可点击元素

    按钮是为任何网络应用程序提供交互性的最常见方式。但我们经常倾向于使用其他HTML元素,如 div span 等作为 clickable 元素。但通过这样做,我们错过了许多内置浏览器的功能。
  • 东方甄选单飞:有些鸟注定是关不住的

    作者:彭宽鸿来源:华尔街科技眼‍‍‍‍‍‍‍‍‍‍东方甄选创始人俞敏洪带队的“7天甘肃行”直播活动已在近日顺利收官。成立后一
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的“网红”。7月5日至9日,为期5天的东方甄选“甘肃行”首次在自有App内直播,
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • 质感不错!OPPO K11渲染图曝光:旗舰IMX890传感器首次下放

    一直以来,OPPO K系列机型都保持着较为均衡的产品体验,历来都是2K价位的明星机型,去年推出的OPPO K10和OPPO K10 Pro两款机型凭借各自的出色配置,堪称有
Top