当前位置: 首页 > news >正文

js 深拷贝、浅拷贝深度解析

赋值操作:

    let obj={a:1,b:[1,2,3],c:{m:2}}let newObj=objnewObj.a=2newObj.b.push(4)newObj.c.m=3console.log(obj,newObj);

 

将一个对象赋值给一个变量,其实就是将这个对象在栈内存中的引用地址复制给了这个变量,这两个对象指向堆内存中的同一个数据引用,所以,其中一个对象的值发生变化,另一个都会跟着变化。

浅拷贝的实现方法:

1. Object.assign()

2. Array.prototype.concat()

3. Array.prototype.slice()

4. 对象和数组的扩展运算符:{...obj},[...arr]

    let obj={a:1,b:[1,2,3],c:{m:2},}const newObj={...obj}obj.a=3obj.b.push(4)console.log(obj,newObj);

 

浅拷贝会在堆内存中开辟新的空间。浅拷贝只复制对象的第一层属性值,如果属性值是基本类型(如数字、字符串、布尔值),则直接复制其值;如果属性值是引用类型(如数组、对象),则复制其引用地址,而不是创建一个新的对象或数组。因此,浅拷贝后的对象和原对象共享相同的引用类型的属性值,修改其中一个对象的这些属性值会影响到另一个对象。

深拷贝实现方法:

1. JSON.parse(JSON.stringify())

    let obj={a:1,b:[1,2,3],c:{m:2}}let newObj=JSON.parse(JSON.stringify(obj))newObj.a=2newObj.b.push(4)newObj.c.m=3console.log(obj,newObj);// 输出结果 obj的数据没有变化

 

    let obj={a:null,b:[1,2,3],c:undefined,fn:()=>{console.log(123);}}let newObj=JSON.parse(JSON.stringify(obj))newObj.b.push(4)console.log(obj,newObj);

 JSON.parse(JSON.stringify()) 可以实现深拷贝,缺点是,如果对象或数组中有函数或undefined,就会丢失。

2. 封装深拷贝函数

    let obj={a:1,b:[1,2,3],c:{m:2},k:undefined,g:null,fn:()=>{console.log(123);}}function deepCloneFunc(obj) {if(typeof obj !=='object') return objconst newObj=obj instanceof Array?[]:{}for(let key in obj){if(obj.hasOwnProperty(key)){const value = obj[key]newObj[key]=typeof value ==='object'?deepCloneFunc(value):value}}return newObj}const newObj=deepCloneFunc(obj)console.log(newObj);

 

深拷贝其实就是在堆内存中重新开辟了一块内存,创建了一个新的对象,这个对象和被拷贝的对象用于相同的属性和值,他们两个在栈内存中的引用地址也不一样,是相互独立的,因此修改任何一个对象的值,另一个都不会跟着变化。

相关文章:

js 深拷贝、浅拷贝深度解析

赋值操作: let obj{a:1,b:[1,2,3],c:{m:2}}let newObjobjnewObj.a2newObj.b.push(4)newObj.c.m3console.log(obj,newObj); 将一个对象赋值给一个变量,其实就是将这个对象在栈内存中的引用地址复制给了这个变量,这两个对象指向堆内存中的同一个…...

CSS文本两端对齐

背景 如果我们要写了列表或表单类的样式&#xff0c;名称长短不一&#xff0c;但是想要两端对齐&#xff0c;如下面这样的&#xff1a; 你是怎么写的&#xff1f; 是这样的吗&#xff0c;在HTML里调整加空格&#xff1a; <ul><li>用户名</li><li>账 …...

C#中的foreach和自定义比较

在C#中foreach不能修改集合里面的值 在C#中&#xff0c;使用 foreach 循环遍历集合时&#xff0c;通常不建议修改集合中的元素&#xff0c;因为 foreach 循环是针对集合的枚举器进行操作的&#xff0c;而枚举器通常不支持修改集合中的元素。如果尝试在 foreach 循环中修改集合…...

有序转化数组(LeetCode)

题目 给你一个已经 排好序 的整数数组 和整数 、 、 。对于数组中的每一个元素 &#xff0c;计算函数值 &#xff0c;请 按升序返回数组 。 解题 在时间复杂度为解决问题 def sortTransformedArray(nums, a, b, c):def f(x):return a * x * x b * x cn len(nums)result…...

大数据信用报告查询有什么作用?怎么选择查询平台?

随着互联网的快速发展&#xff0c;人们的金融行为越来越多地依赖于网络平台。然而&#xff0c;网络上的金融交易存在着一定的风险&#xff0c;为了有效地防范这些风险&#xff0c;金融机构采用了大数据技术进行风险控制&#xff0c;下面&#xff0c;小易大数据平台将详细介绍大…...

import cv2ModuleNotFoundError: No module named ‘cv2‘

import cv2 ModuleNotFoundError: No module named cv2 (base) PS D:\CAMERA-D861T\LabelImg> pip3 install cv2 ERROR: Could not find a version that satisfies the requirement cv2 (from versions: none) ERROR: No matching distribution found for cv2 办法1 试了无…...

[Modbus] Modbus协议开发-基本概念(一)

历史 ModBus官网是Modicon&#xff08;Modicon早年已被施耐德收购&#xff09;公司为其PLC通讯而开发的一种通讯协议。 概述 通过Modbus协议&#xff0c;控制器之间、或控制器经由网络&#xff08;如以太网&#xff09;可以和其它设备之间进行通信。 优点 免费、好用、成熟…...

爬虫代理的使用:提升爬虫效率

爬虫代理的基本概念 爬虫代理&#xff0c;简单来说&#xff0c;就是位于客户端和目标服务器之间的一个中转站。当爬虫发起请求时&#xff0c;不是直接发送给目标服务器&#xff0c;而是先发送给代理服务器&#xff0c;再由代理服务器转发给目标服务器。目标服务器响应后&#…...

【gcc】基于gpt和python的流程和延迟梯度分析

Core Flow and Algorithm Concepts of GCC (Google Congestion Control) 【TWCC 】基于gpt和python简化分析webrtc拥塞控制论文: Analysis and Design of the Google Congestion Contro for Web Real-time Communication (WebRTC)参考大神的理解发送码率(send bitrate)影响了网…...

前端CSS总结

目录 前言 正文 CSS基础介绍&#xff1a; CSS选择器&#xff1a; 元素选择器&#xff1a; id和class选择器&#xff1a; 后代选择器和群组选择器&#xff1a; 盒子模型 content&#xff1a; padding&#xff1a; border&#xff1a; margin&#xff1a; 字体样式 …...

Linux/C 高级——指针函数

1.概念 本质是函数&#xff0c;函数的返回值为指针。类比着指针数组。 指针数组&#xff1a;本质是数组&#xff0c;数组中存放指针。 数据类型 *数组名[元素个数]; int a[2][3]; int *arr[2] {a[0],a[1]}; //*(*(arri)j) *(arr[i]j) arr[i][j] 2.定义格式 格式&#xff1a; 数…...

GRU门控循环单元【数学+图解】

文章目录 1、简介2、门控机制3、公式4、图解GRU4.1、重置门和更新门4.2、候选隐藏状态和隐藏状态⭐ 5、LSTM与GRU的对比6、应用7、训练技巧 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff…...

代码随想录算法训练营第六十一天|Bellman_ford 队列优化算法(又名SPFA)、bellman_ford之判断负权回路

卡码网&#xff1a;94. 城市间货物运输 I from collections import dequeclass Edge:def __init__(self, to, val):self.to to # 链接的节点self.val val # 边的权重def main():n, m map(int, input().split())grid [list() for _ in range(n 1)] # 初始化邻接表for _…...

ArrayList集合源码解读(二)已完结

ArrayList集合源码解读&#xff08;二&#xff09; 前言 这篇文章已经把 ArrayList 更完了。各位还想看什么源码可以私信我~~ 上节课带大家阅读了 ArrayList 中的核心扩容代码&#xff0c;那么今天带大家阅读下List集合中我们常用的几个方法的底层实现逻辑&#xff01; 常用…...

光伏逆变器、MPPT、PCS储能变流器、BMU、BCU、BDU和液冷机组

一、光伏逆变器 光伏逆变器&#xff08;PV inverter或solar inverter&#xff09;可以将光伏&#xff08;PV&#xff09;太阳能板产生的可变直流电压转换为市电频率交流电&#xff08;AC&#xff09;的逆变器&#xff0c;可以反馈回商用输电系统&#xff0c;或是供离网的电网使…...

OpenHarmony编译

简介&#xff1a;本文将会介绍编译OpendHarmony环境的搭建、编译、和刷机&#xff08;rk3568&#xff09; 使用场景&#xff1a;修改系统源码&#xff0c;需要验证修改的功能是否正确、编译镜像、编译SDK 1、VS Code&#xff0c;下载链接&#xff0c;用于修改源码 2、linux环…...

C语言典型例题30

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 习题2.7 从银行贷了一笔款d&#xff0c;准备每月还款额为p&#xff0c;月利率为r&#xff0c;计算多少个月能还清。 设d30000元&#xff0c;p6000元&#xff0c;r1%。对求得的月份取小数点后一位&#xff0c;对第二…...

springMVC @RestControllerAdvice注解使用方式

使用 RestControllerAdvice 的主要场景包括&#xff1a; 全局异常处理&#xff1a;处理所有控制器中抛出的未捕获异常。数据校验失败处理&#xff1a;处理 Bean Validation 校验失败的情况。自定义响应&#xff1a;统一定义响应格式或错误信息。 RestControllerAdvice 注解的…...

HarmonyOS鸿蒙开发岗位面试中关于组件的问题总结

文章目录 1. 鸿蒙组件的基本概念2. 组件的使用3. 布局管理4. 组件间通信5. 组件化开发6. 性能优化7. 实战应用 鸿蒙应用开发岗位面试中关于鸿蒙组件的问题&#xff0c;通常会涉及多个关键知识点&#xff0c;这些知识点涵盖了鸿蒙组件的基本概念、使用、布局管理、性能优化、组件…...

Unity 在Editor下保存对Text组件的文本的修改

Unity 在Editor下保存对Text组件的文本的修改 /****************************************************文件&#xff1a;TimeStampForText.cs作者&#xff1a;lenovo邮箱: 日期&#xff1a;2024/8/8 1:9:21功能&#xff1a; *************************************************…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...