深拷贝和浅拷贝

article/2025/9/17 2:35:01

深拷贝和浅拷贝的知识涉及到堆栈的概念。

堆栈的概念:

基本类型:
名值存储在栈内存中,例如:

let a = 1;

引用类型:
名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值;

总体来说就是栈内存中保持的是基本类型的值,引用类型的“引用”,堆内存中保存的是创建的对象实例。

浅拷贝:

b clone了 a
当修改a的时候,b也会发生改变
这就是浅拷贝。
但是基本类型不会受其影响:

let a = 2;
let b = a;
a = 3;
console.log(a, b)	//3,2

引用类型的数据就会受其影响:

let a = [0, 1, 2];
b = a;
a[0] = 3;
console.log(a, b)	//结果相同

在这里插入图片描述
特别注明: jQuery的extend默认是浅拷贝的方法

在这里插入图片描述
在这里插入图片描述

那么我们如何实现深拷贝呢?

1.使用递归去复制所有层级属性。
这里封装一个深拷贝的函数

function deepClone(obj){let objClone = Array.isArray(obj)?[]:{};if(obj && typeof obj === "object"){for(key in obj){if(obj.hasOwnProperty(key)){//判断obj子元素是否为对象,如果是,递归复制if(obj[key] && typeof obj[key]==="object"){objClone[key] = deepClone(obj[key]);} else {//如果不是对象,简单复制objClone[key] = obj[key];}}}}return objClone;
}
let a = [1,2,3,4],b = deepClone(a);
a[2]=100;
console.log(a,b)  //结果不同,b已经脱离a的控制了

在这里插入图片描述
这里再次强调,深拷贝是拷贝对象各个层级的属性!
我们在试一试数组的slice()方法:

t a = [1,2,3,4],
b = a.slice();
a[0] = 2;
console.log(a,b)  //不相同

在这里插入图片描述
slice()实现了深拷贝?
别着急下定论,我们在测试一下:

let a = [1,[2,3],4],
b = a.slice();
a[0]=3;
a[1][0]=4;
console.log(a,b)  //1级属性不相同,2级属性相同

在这里插入图片描述
所以slice()方法并不是真正的深拷贝。
第一层的属性确实深拷贝,拥有了独立的内存,但更深的属性却仍然公用了地址,所以才会造成上面的问题。同理,concat方法与slice也存在这样的情况,他们都不是真正的深拷贝。这里需要注意一下。

2.除了递归,我们还可以借用JSON对象的parse和stringify

function deepClone(obj){let _obj = JSON.stringify(obj),objClone = JSON.parse(_obj);return objClone;
}
let a = [0,[1,2],3],b = deepClone(a);
a[0]=3;
a[1][0]=6;
console.log(a,b)

结果如下:
在这里插入图片描述
JSON.stringfly与JSON.parse除了实现深拷贝,还能结合localStorage实现对象数组存储。

3.除了上面俩种方法之外,我们还可以借用jQuery的extend方法
$.extend([deep],target,object1[,objectN])
deep表示是否深拷贝,为true为深拷贝,为false,则为浅拷贝
traget Object类型,目标对象,其他对象的成员属性将被附加到该对象上。
object1 objectN可选。 Object类型 第一个以及第N个被合并的对象。

代码如下:
在这里插入图片描述
结果如下:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/E9vTolgW.shtml

相关文章

深拷贝和浅拷贝的区别详解

深拷贝和浅拷贝的作用是复制对象数据,这两者都用于构造拷贝构造函数中,那么这俩之间到底有什么区别呢? 先上答案 - 浅拷贝:简单的赋值拷贝操作 - 深拷贝:在堆区重新申请内存空间,进行拷贝操作 下面举一个…

Python深拷贝与浅拷贝的区别

首先深拷贝和浅拷贝都是对象的拷贝,都会生成一个看起来相同的对象,他们本质的区别是拷贝出来的对象的地址是否和原对象一样,也就是地址的复制还是值的复制的区别。 什么是可变对象,什么是不可变对象: 可变对象是指&am…

详解JS深拷贝与浅拷贝

深拷贝与浅拷贝 深拷贝和浅拷贝都只针对引用数据类型,浅拷贝会对对象逐个成员依次拷贝,但只复制内存地址,而不复制对象本身,新旧对象成员还是共享同一内存;深拷贝会另外创建一个一模一样的对象,新对象跟原对…

c++深拷贝与浅拷贝

浅拷贝:简单的赋值拷贝操作(这个是系统默认提供的) 深拷贝:在堆区重新释放空间,进行拷贝操作(要自己写的) 简单来说,只要类属性里有指针等就必须利用深拷贝操作 为便于深刻理解&a…

实现深拷贝与浅拷贝的方法

深拷贝与浅拷贝概念: 深浅拷贝出现的前提: 应用类型的数据(对象和数组) 深拷贝就是把目标对象里面的数据一个一个都复制下来,创建出一个一模一样的,存放地址不一样,互不影响。就像真假美猴王。改…

深拷贝和浅拷贝的区别及实现方法

文章目录 一、引言二、浅拷贝1.Object.assign()2.concat()3.扩展运算符 三、深拷贝1. 利用json数据和json字符串之间的转换2.$.extend()3. 递归 查阅多篇文章后,自己归纳总结对深拷贝和浅拷贝的理解,不足之处,还望多多指导 一、引言 基本数据…

深拷贝与浅拷贝的区别

深拷贝与浅拷贝是针对对象属性为对象的,因为基本数据类型在进行赋值操作时(也就是深拷贝(值拷贝)),是直接将值赋给了新的变量,也就是该变量是原变量的一个副本,这时,你修…

深拷贝和浅拷贝的区别是什么?

深拷贝和浅拷贝的区别是什么? 1、浅拷贝 (1)、定义 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主"对象进行拷贝,但不会复制主对象里面的对象。"里面的对象”会在…

深拷贝和浅拷贝常见的实现方式

浅拷贝的实现方式 1. Object.assign()方法 assign()方法是把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。但是他的拷贝方式不是固定的,看下面的代码演示: let obj {username: kobe}; let obj2 Object.assign({},o…

什么是深拷贝和浅拷贝?以及怎么实现深拷贝和浅拷贝?

拷贝浅是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址,所以如果其中一个对象改变了这个地址,就会影响到…

Java的深拷贝与浅拷贝的区别

1.二者的区别 浅拷贝:在拷贝一个对象时,对对象的基本数据类型的成员变量进行拷贝,但对引用类型的成员变量只进行引用的传递,并没有创建一个新的对象,当对引用类型的内容修改会影响被拷贝的对象。 深拷贝:在…

深拷贝和浅拷贝的区别(必须掌握)

前言: 在面试中,你必须要知道的一个知识点,那就是浅拷贝和深拷贝,那么就必须知道基本数据类型和引用类型,其实深拷贝和浅拷贝的主要区别就是其在内存中的存储类型不同。 网片来自网络(侵删) …

C++的浅拷贝与深拷贝

目录 前言 一、区别 二、浅拷贝 1.简单描述 2.代码实例 三.深拷贝 1.简单描述 2.代码实例 四.完整代码 五.运行结果 总结 前言 C中有两种拷贝:深拷贝和浅拷贝 要是想要运用好拷贝函数就必须清楚深拷贝与浅拷贝的区别 一、区别 1 在未定义拷贝构造函数…

拷贝构造(深拷贝、浅拷贝)

一、概念介绍 拷贝构造:拷贝构造函数,又称构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构造及初始化。 其唯一的形参必须是引用,但并不限制为const,一般普遍的会加上c…

C++——深拷贝和浅拷贝

1.浅拷贝与深拷贝的区别 浅拷贝(默认拷贝函数):将原对象或原数组的引用直接赋给新对象,新数组,新对象/新数组只是原对象的一个引用。 深拷贝:创建一个新的对象和数组,将原对象的各项属性的“值”…

深拷贝和浅拷贝的区别和与原理

一、基本类型和引用类型 string,number,boolean,null,undefined,symbolFunction,Array,Object 基本类型是按值访问的,引用类型是按引用访问 基本类型和引用类型也有人叫原始类型和对象类型,拥有方法的类型和不能拥有方法的类型,可变类型和不…

浅拷贝、深拷贝

深拷贝和浅拷贝 这两个概念是在项目中比较常见的,在很多时候,都会遇到拷贝的问题,我们总是需要将一个对象赋值到另一个对象上,但可能会在改变新赋值对象的时候,忽略掉我是否之后还需要用到原来的对象,那么就…

深拷贝和浅拷贝(copy和deepcopy)详解

深拷贝和浅拷贝(copy和deepcopy)详解 详细解释存储方式列表的增删改列表修改已有值列表新增一个值列表整体重新赋值 copy与deepcopy的区别不可变类型可变类型 浅拷贝指的是创建一个新对象,其中包含原始对象的引用(指针&#xff09…

浅拷贝和深拷贝的区别?

创建Java对象的方式包括new、反射、反序列化、拷贝,那么什么是拷贝呢?浅拷贝和深拷贝又有什么区别呢? 什么是拷贝 拷贝就是为了复用原对象的部分或全部数据,在原对象的基础上通过复制的方式创建一个新的对象。 Object类中有nati…

深拷贝和浅拷贝的区别

首先,明确一点深拷贝和浅拷贝是针对对象属性为对象的,因为基本数据类型在进行赋值操作时(也就是拷贝)是直接将值赋给了新的变量,也就是该变量是原变量的一个副本,这个时候你修改两者中的任何一个的值都不会…