js——深拷贝和浅拷贝

深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。对于基本数据类型,例如字符串、数字、布尔值等,由于它们是按值传递的,所以不存在深拷贝和浅拷贝的问题。

深拷贝

将对象从内存中完整拷贝出来,从堆内存中开辟一个新的区域存放新的对象(新旧对象不共享同一块内存),修改新数据不影响原对象

javascript 复制代码
let obj1 = { prop1: 10 };  
let obj2 = JSON.parse(JSON.stringify(obj1));  
obj2.prop1 = 20;  
  
console.log(obj1.prop1); // 输出 10  
console.log(obj2.prop1); // 输出 20
// 这里arr1和arr2是两个独立的对象,修改obj2.prop1的值不会影响obj1.prop1的值
// 深拷贝创建了一个新的对象,并复制了原始对象的所有属性和值

浅拷贝

引用类型:拷贝的是内存地址 (新旧地址共享同一块内存)只是拷贝了指针,使得两个指针指向同一个地址,但是这样在对象块结束之后,调用函数解析构的时候会造成同一份资源析构两次,即删除了同一份内存2次,会造成程序崩溃

在js中没有指针的概念,js中的变量实际上是对象的引用,你可以把它们理解成隐式的指针,当一个对象赋值给另一个变量时,实际上就是复制对象的引用,而不是对象本身

javascript 复制代码
let arr1 = [1, 2, 3];  
let arr2 = arr1;
arr1[1] = 4;            // 因为它们引用的是同一个数组,所以当arr1里面的数据发生变化的时候,arr2里面的数据也会发生变化 因为它们指向的是同一个内存地址
console.log(arr1); // 输出 [1, 4, 3]  
console.log(arr2); // 输出 [1, 4, 3]
// 这是因为它们引用的是同一个数组。
// 这就是浅拷贝的概念:它只复制对象的顶层结构,而不复制内部的子对象。因此,对拷贝后的对象进行的任何修改都会影响到原始对象。

总结:

浅拷贝拷贝的是对象的引用,当对目标对象进行修改时,源对象也会发生变化,因为它们指向的是同一个内存地址,浅拷贝只复制了对象的顶层结构,而没有复制内部的子对象。

深拷贝拷贝的是**对象的内容,**不仅复制对象的顶层结构,还递归复制了内部的所有子对象,这意味着拷贝出来的目标对象与源对象是完全独立的,它们不共享内存地址,当对目标对象进行修改的时候,源对象不会受到影响,因为它们的内存地址不同。深拷贝会创建一个新的对象,并将原始对象的所有属性和值复制到新对象中。

相关推荐
豆沙沙包?2 小时前
2026年--Lc334-2130. 链表最大孪生和(链表转数组)--java版
java·数据结构·链表
Python_Study20254 小时前
制造业数据采集系统选型指南:从技术挑战到架构实践
大数据·网络·数据结构·人工智能·架构
SmoothSailingT5 小时前
408每日一题——数据结构
数据结构·考研·408
im_AMBER7 小时前
Leetcode 99 删除排序链表中的重复元素 | 合并两个链表
数据结构·笔记·学习·算法·leetcode·链表
s砚山s8 小时前
代码随想录刷题——二叉树篇(十三)
数据结构·算法
ulias2128 小时前
AVL树的实现
开发语言·数据结构·c++·windows
黎雁·泠崖8 小时前
二叉树知识体系全梳理:从基础到进阶一站式通关
c语言·数据结构·leetcode
蜕变菜鸟9 小时前
JS的Object.keys()和sort()排序的用法
数据结构·算法
镜中人★9 小时前
408数据结构考纲知识点(更新中)
数据结构
杜子不疼.9 小时前
【LeetCode30_滑动窗口 + 哈希表】:三招搞定“串联所有单词的子串”
数据结构·算法·哈希算法