关于浅拷贝深拷贝那些事儿

6层高速PCB设计实战:BGA布局与阻抗匹配关键解析 本文深入解析6层高速PCB设计中BGA布局与阻抗匹配的关键技术。通过实战经验分享,详细介绍了六层PCB层叠结构的选择与优化、BGA器件布局技巧、阻抗匹配的实战经验以及高速布线技巧,帮助工程师提升PCB设计水平,确保信号完整性和电源完整性。 阅读详情

概念

浅拷贝:拷贝的只是对象的(引用)地址,新旧对象还是共享同一块内存,修改新对象会影响到原始对象数值发生变化

深拷贝:完全复制一个对象出来,新旧对象不共享内存,修改新对象不会改变原对象

浅拷贝

直接赋值
  • 任何操作都会影响原数组
let arr = [1, 2, 3, 4]
let newArr = arr
newArr.push(5, 6, 7)
console.log('newArr:', newArr) // [1, 2, 3, 4, 5, 6, 7]
console.log('arr:', arr) // [1, 2, 3, 4, 5, 6, 7]
Object.assign()
  • 拷贝属性值,假如属性值是一个对象的引用,那么也会指向那个引用
let obj = {
	id: 1,
	name: 'karim',
	msg: {
		age: 18
	}
};
let newObj = {};
Object.assign(newObj, obj);
// 修改拷贝后的对象中某一个值后,原来的对象也会改变
newObj.msg.age = 20;
console.log('拷贝后新对象:', newObj.msg.age) // 拷贝后新对象: 20
console.log('原对象:', obj.msg.age) // 原对象: 20
Array.prototype.concat()

注意:如果数组中都是简单数据类型,可以作为深拷贝使用

let arr = [1, 2, 3, 4, 5]
let newArr = [].concat(...arr)
newArr.push(6)
console.log('newArr', newArr) // [1, 2, 3, 4, 5, 6]
console.log('arr', arr) // [1, 2, 3, 4, 5]
实现浅拷贝
let arr = [1, 2, 3, { obj: 'karim' }]
let newArr = [].concat(...arr)
console.log('newArr', newArr[3]) // {obj: "xiaoming"}
newArr[3].obj = 'xiaoming'
console.log('arr', arr[3]) // {obj: "xiaoming"}
Array.prototype.slice()

与concat()方法同理,简单类型可以作为深拷贝

let arr = [1, 2, 3, 4, 5]
let newArr = arr.slice(0, 5)
console.log('newArr', newArr) // [1, 2, 3, 4, 5]
newArr.push(7)
console.log('arr', arr) // [1, 2, 3, 4, 5, 7]
实现浅拷贝
let arr = [{ a: '123' }, { b: '456' }]
let newArr = arr.slice(0, 2)
console.log('newArr', newArr) // 0: {a: "123"} 1: {b: "789"}
newArr[1].b = '789'
console.log('arr', arr) // 0: {a: "123"} 1: {b: "789"}
使用扩展运算符
let arr = [{ a: '123' }, { b: '456' }]
let newArr = [...arr]
newArr[0].a = '789'
console.log('newArr', newArr[0].a) // newArr 789
console.log('arr', arr[0].a) // arr 789
通过for..in循环进行对象的遍历
let obj = {
	id: 1,
	name: 'karim',
	msg: {
		age: 18
	}
};

let newObj = {};
for (let k in obj) {
  /*	console.log('对象的值为:', obj[k])*/
	newObj[k] = obj[k];
}
// 修改拷贝后的对象中某一个值后,原来的对象也会改变
newObj.msg.age = 20
console.log('拷贝后新对象:', newObj.msg.age); // 拷贝后新对象: 20
console.log('原对象:', obj.msg.age) // 原对象 20

实现浅拷贝的方式不仅局限于上面的几种还可以用jQuery中的$.extend()函数,Lodash工具库的clone方法,都可以实现,可以自行To learn on their own下。

深拷贝

手动复制对象
  • 完全的copy一个新对象出来
let obj = {
	a: '123',
	b: '234'
}
let newObj = {
	a: obj.a,
	b: obj.b
}
newObj.a = '456'
console.log('newObj', newObj)// {a: "456", b: "234"}
console.log('obj', obj) // {a: "123", b: "234"}
使用JSON.parse(JSON.stringify(obj))

用JSON.stringify把对象转成字符串,再用JSON.parse把字符串转成新的对象,这个拷贝需要注意的是不能拷贝函数,因为JSON格式字符串不支持Function,在序列化的时候会自动删除

let obj = {
	a: '123',
	b: '234'
}
let newObj = JSON.parse(JSON.stringify(obj))
console.log(newObj) // {a: "123", b: "234"}
newObj.a = '456'
console.log(obj) // {a: "123", b: "234"}

使用递归的方式

let obj = {
	id: 1,
	name: 'karim',
	msg: {
		age: 18
	},
	habits: ['reading', 'coding', 'playGames']
};
let newObj = {};
function deepCopy(newObj, obj) {
	// 遍历对象
	for (let k in obj) {
		// 将属性值赋值到item变量中
		let item = obj[k];
		// 判断值是否是数组
		if (item instanceof Array) {
			newObj[k] = [];
			deepCopy(newObj[k], item);
		} else if (item instanceof Object) { // 判断是否是对象
			newObj[k] = {};
			deepCopy(newObj[k], item)
		} else { // 是否是简单数据类型
			newObj[k] = item;
		}
	}
	// 返回深拷贝后的对象
	return newObj
}
deepCopy(newObj, obj);
newObj.msg.age = 21;
console.log(newObj.msg.age); // 21
console.log(obj.msg.age);  // 18

其他方法大家可以自行摸索下,比如lodash的_.cloneDeep()等等。

参考资料:

js深拷贝和浅拷贝及其实现方式:

深拷贝的实现方式

如何写出一个惊艳面试官的深拷贝?

End~

个人博客已上线,欢迎来访~
传送门:夜雨炊烟

华为鸿蒙系统也能用!5分钟搞定谷歌三件套安装(附最新APK下载链接) 本文为华为鸿蒙系统用户提供了一份详尽的谷歌三件套(Google Play服务、商店及框架)手动安装指南。文章核心在于无需Root,通过ADB命令获取设备信息,并从可靠来源下载匹配版本的APK,按照正确顺序安装,从而解决海外应用依赖问题,实现5分钟快速部署。 阅读详情

相关推荐

MyEclipse 2017 CI 10安装与激活

本文介绍MyEclipse 2017 CI 7、CI 8、CI 9和CI 10的安装与激活。此方法理论上应该能激活MyEclipse 2017 CI所有系列,即激活方法是通用的,只是激活文件略有不同。本文提供MyEclipse 2017 CI 7、CI 8、CI 9和CI 10的激活文件。说明:博主所提供的压缩包格式均为RAR5,即WinRAR 5.0以上的版本才能正常解压,别的压缩软件博主不太清...

weixin_42539046的博客 9416

关于java对象作为方法参数传递到一个方法后,对象内容是否发生改变的相关分析

问:当一个对象被当做参数传递到一个方法后,此方法可改变这个对象的属性,并返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递。在java语言中只有值传递参数;当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象引用的一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但是对象的引用(不是引用的副本)是永远不会改变的。 Java参数:不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,传值一般相对于传地址而言) 若...

xiaolegeaizy的博客 2823

HFSS学习笔记——Vivaldi天线仿真(一)

Vivaldi 天线HFSS仿真,HFSS中指数曲线绘制及曲面绘制。

and_future的博客 1万+

php中对二维数组的去重,合并,排序,分页操作,统计数组中所有值出现的次数。

废话不多说,直接上代码列子,简单易懂。 // 构造二维数组a $array_a = array( 'a' => 1; 'b' => 2; ); //构造二维数组b $array_b = array( 'a' => 2; 'b' => 2; ); // 将俩个数组合并 $array = array_merge_recursive($array_a, $array_b); // 拼接起来的数组按照a的大小倒序 array_multisort(array_column($array

JerryKit的博客 665

FreeRTOS移植实战:从零开始在STM32上搭建多任务系统(含Proteus仿真配置)

本文详细介绍了如何在STM32平台上从零开始移植FreeRTOS,并搭建多任务系统,包含Proteus仿真配置。通过环境准备、源码移植、多任务设计到仿真调试的全流程实战,帮助开发者快速掌握FreeRTOS在STM32上的应用技巧,提升嵌入式开发效率。

weixin_33737134的博客 232

vue高德地图POI关键字搜索定位

最近在项目中遇到了关于地图的问题,首先为了满足需求从而使用的是JSAPI为2.0版本的。需求是根据关键字搜索定位到该位置。值得注意的是在使用 AMap.Event.addListener时 Event一定要大写的E,不然页面会报错。在地图上定义一个输入框,根据输入的位置进行提示,然后点击后跳转到对应的位置并打点标记。JSAPI主要使用这两个。

YL 2136

两个对象进行对象之间的赋值 出现更改当前对象原来赋值对象也被更改

出现这个问题 是引用地址的问题 别管他了直接看解决办法吧 使用Object.assign(目标对象,源对象) 会返回新的目标对象

qq_36406553的博客 1062

playwright-mcp 安装使用的详细教程

Playwright MCP 快速入门指南 Playwright MCP Server 是由微软开发的浏览器自动化服务,通过 MCP 协议为 AI/Agent/LLM 提供网页交互能力。它基于可访问性树而非屏幕截图,支持多种浏览器和运行模式。 安装要求: Node.js v18+ 命令行操作能力 支持 MCP 的客户端 安装方式: 通过 npx 快速启动:npx @playwright/mcp@latest 项目依赖安装:npm install @playwright/mcp 主要特性: 支持 Chrome

上善若水 7997

js赋值,浅拷贝,深拷贝的区别及手写--判断两个对象是否相等--打印属性与对象展开不一致问题

深拷贝和浅拷贝的区别? 浅拷贝: 将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引用。 深拷贝: 创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是“引用”。 浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。 但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。 浅拷贝方法: 1. JSON.parse(JSON.stringify()) ...........

weixin_43190804的博客 1600

基于深度学习的柑橘病害检测系统——YOLOv8 + UI界面 + 数据集

深度学习是机器学习的一种重要分支,它通过构建多层的神经网络(尤其是卷积神经网络CNN)来从大规模的数据中学习特征。近年来,深度学习特别是在计算机视觉领域取得了显著的进展,成为图像分类、目标检测、图像分割等任务的主要技术。对于农业病害检测问题,深度学习通过对大量带标签的病害图像进行训练,能够自动识别不同类型的病害,并判断病害的程度。通过图像中目标(病害区域)的边界框,可以快速定位病害区域,进一步分析其影响范围。

YOLO 1044

5、自适应 RBF 神经网络控制方法解析

本文详细解析了基于RBF神经网络的多种自适应控制方法,包括针对函数未知、参数未知以及存在外部干扰的非线性系统的控制策略。通过李雅普诺夫稳定性理论设计自适应律,确保闭环系统稳定,并结合仿真示例和MATLAB代码实现,展示了方法的有效性。文章还对比了不同控制方法的适用场景,并给出了实际应用流程,为复杂系统控制提供了系统性解决方案。

ol789012的博客 72

JS常见坑现象:直接用=的方式把一个JSON对象赋值给另一个JSON对象,会导致修改新对象时,原对象也发生变化

原因:JavaScript 中对象的赋值是默认引用赋值的(两个对象指向相同的内存地址) 解决办法 this.edit = Object.assign({}, info, { ParkID: 1, ParkName: “aaa” }) 示例 var a={1:2} var b=a console.log(b[“1”]) ///输出结果 2 新赋值 b[“1”]=9 console.log(b[“...

刚刚说 3562

【保姆级教程】YOLOv8_Pose多目标+关键点检测:训练自己的数据集

【保姆级教程】YOLOv8_Pose多目标+关键点检测:训练自己的数据集

m0_51579041的博客 1万+

深拷贝和浅拷贝的那些事儿

浅拷贝和深拷贝

weixin_46602241的博客 123

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

深拷贝与浅拷贝的那些事儿

在Java语言里,当我们需要拷贝一个对象时,有两种类型的拷贝:浅拷贝与深拷贝。浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化。而深拷贝则是拷贝了源对象的所有值,所以即使源对象的值发生变化时,拷贝对象的值也不会改变。如下图描述: 了解了浅拷贝和深拷贝的区别之后,本篇博客将教大家几种深拷贝的方法。 拷贝对象 首先,我们定义一下需要拷贝的简单对象。 /** * 用户 */ public class User { private String name;

You’re a wanderer just like me 260

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

聊一聊web前端那些事儿,关于深拷贝和浅拷贝

深拷贝和浅拷贝是经常在面试中会出现的,主要考察你对基本类型和引用类型的理解深度。我在无数次的面试中,应聘者还没有一个人能把这个问题回答情况,包括很多机构的培训老师。这篇文章会让你把基本类型和引用类型的区别搞得清清楚楚,搞清楚这两者的区别,你对任何编程语言的都不怕,因为,这不是js一门语言,是任何编程语言中都需要掌握的知识,而且,在任何编程语言中,两者都是一样的。 深拷贝和浅拷贝主要是...

IT教育任姐姐的博客 199

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【JavaSE】Cloneable?关于深拷贝与浅拷贝那些事儿咱们一次聊明白

什么是深拷贝,什么是浅拷贝?Java中又该如何实现对象的拷贝呢?这篇文章,深浅拷贝区别与实现一次给你聊明白!

黄小黄的博客 720

iOS开发那些事儿(五)Objective-C浅拷贝与深拷贝

浅拷贝:copy操作出来的对象指针直接指向模板的地址。即两个对象公用一块内存地址 1 #import <Foundation/Foundation.h> 2 int main(int argc, const char * argv[]) { 3 @autoreleasepool { 4 NSString * testStr ...

HB8889的博客 167

【点杀iOS】深拷贝&浅拷贝&copy的那些事儿

什么是深拷贝?什么是浅拷贝? 为什么经常看到字符串属性要这样定义,那个copy是神马意思? @property(nonatomic,copy)NSString* name; 为什么下面的写法是错误的? @property(nonatomic,copy)NSMutableString* name; copyWithZone方法又到底是干嘛用的? 接下来,我们将...

weixin_34075268的博客 88

关于数据对象浅拷贝和深拷贝的那些事儿!

浅层拷贝 该类型拷贝针对引用类型的数据类型(如数组和对象),拷贝的地址,改变其中一个数据内容,另一个数据的内容也会改变。 eg. 1.直接进行数组和对象的赋值拷贝; 2.对对象中有数组或对象的键进行拷贝(该例子中通过键名拷贝键值。name键的值是字符类型,所以是深拷贝。而剩余两个因为值数组和对象,所以是浅拷贝) //定义一个对象 var obj = { name:“zs”, teg: [“数据结构...

weixin_45103372的博客 495

【Java】小老弟,别再被Java深拷贝浅拷贝绕晕啦

本文以代码和图解形式剖析 Java 对象深拷贝与浅拷贝。浅拷贝复制基本类型属性值,引用类型仅复制引用,新原对象引用属性指向同一地址;深拷贝对引用类型也递归创建新对象,指向不同地址。

JavaDog程序狗 1418

JS中的深拷贝和浅拷贝区别图解

深浅拷贝 深浅拷贝这个东西是十分基础的,它涉及到了堆栈的问题,如果想要理解深浅拷贝的区别,首先要明白堆和栈的区别。 所以我们先来说一说堆和栈的区别: 堆和栈你可以当成计算机内存中的两个不同的大盒子,不同的数据类型放在不同的盒子里。 我们都知道数据类型分为两种:简单数据类型和复杂数据类型。复杂数据类型就是数组、对象、函数这三个,其他的就是简单数据类型。简单数据类型呢就是放在栈中,复杂数据类型的内容放...

m0_46387873的博客 431

JavaScript 引用数据类型的浅拷贝和深拷贝

作为一名前端工作者,传递数据是我们最常见不过的操作。所以,这篇我整理了原来的学习笔记,在此做一个 ‘ 深拷贝和浅拷贝 ’ 的总结;在上方法之前,我们需要知道几个概念: 1,数据类型是什么玩意儿? 数据类型,说白了就是对数据按照某种规则(呵,我不知道)打上不同的分类标签。这样做的目的首先是方便 ‘ 程序工程狮’ 方便逻辑进展和纠错;其次是在计算机分配内存的时候,按照不同的类型分配空间,避免了内存的浪费; 基本数据类型:也称为 ‘ 简单数据类型 ’ ,JavaScript的...

weixin_39166851的博客 459

5张图彻底理解Python中的浅拷贝与深拷贝_如何理解python的浅拷贝和深拷贝(3)

① 2000多本Python电子书(主流和经典的书籍应该都有了)② Python标准库资料(最全中文版)③ 项目源码(四五十个有趣且经典的练手项目及源码)④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)⑤ Python学习路线图(告别不入流的学习)输出结果发现没有,赋值就是对物体进行贴标签操作,作用于同一物体。而浅拷贝则会创建一个新的对象,至于对象中的元素,它依然会引用原来的物体,我们再来看一段例子输出如下。

2401_84572413的博客 1072

python18-深拷贝和浅拷贝

【代码】python18-深拷贝和浅拷贝。

春风若有怜花意,可否许我再少年 454

关于深浅拷贝的那些事儿(一)

个人学习笔记,很多不足 一、赋值、浅拷贝、深拷贝的区别 首先JS中主要分为两种数据类型,一种是基本数据类型,另一种是复杂数据类型,深浅拷贝zhen'dui'de

weixin_49343253的博客 239
上一篇: Eclipse2018正确安装JD-Eclipse反编译插件
下一篇: 深入JavaScript系列之原型和原型链
夜雨炊烟
博客等级 码龄8年 26粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜雨炊烟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值