深拷贝和浅拷贝区别和理解

207 阅读1分钟

1. 个人粗浅理解

两个对象ABA有数据 B为空,B复制了A,我们修改A,如果B中的数据跟着变化了,
那就是浅拷贝,如果没有变化,那就是深拷贝。说明B另开辟了一块内存。

2. 基础的了解

基本数据类型:numberstringbooleannullundefinedsymbol等;
引用数据类型:object({}对象,数组[]),function函数等;

因为拷贝是对数据进行操作,所以我们得了解一下这两类的数据存储方式;
基本数据类型一般存储在栈中;引用数据类型一般存放在堆中;

3. 更深的理解

JavaScript存储对象都是存地址的,所以浅拷贝会导致 AB 指向同一块内存地址。
改变了其中一方的内容,都是在原来的内存上做修改会导致拷贝对象和源对象都发生改变,
而深拷贝是开辟一块新的内存地址,将原对象的各个属性逐个复制进去。
对拷贝对象和源对象各自的操作互不影响。

4. 举个例子(Object.assign())

Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。
但是 Object.assign()进行的是浅拷贝,拷贝的是对象的属性的引用,而不是对象本身。

image.png

注意:当object只有一层的时候,是深拷贝

image.png