深拷贝和浅拷贝的区别
浅拷贝:假设有A数组,B复制了A数组,当A数组改变,B数组也改变,说明是浅拷贝
深拷贝:假设有A数组,B复制了A数组,当A数组改变,B数组没改变,说明是深拷贝
let a = [0,1,2,3,4], b=a
console.log(a===b) // true 说明拷贝成功
a[0] = 1
console.log(a,b) // [1,1,2,3,4] [1,1,2,3,4]
a改变了b也改变,说明这是一个浅拷贝,为什么会是一个浅拷贝呢?因为a是一个引用数据类型,我们都知道数据类型可以分为两大类,基本数据类型和引用数据类型。
在基本数据类型中,key和value都是存在栈内存中 例如 let a = 1
key | val |
---|---|
a | 1 |
当我用b = a进行拷贝时,栈内存会开辟一个新的内存
key | val |
---|---|
a | 1 |
b | 1 |
所以即便此时我将a改成2,b也不会受到影响,这就是深拷贝
在引用数据类型中,key存在栈内存中,value存在堆内存中,但是栈内存会提供一个引用的地址指向堆内存的值
栈内存
key | val |
---|---|
a | 堆地址1 |
堆内存
key | val |
---|---|
堆地址1 | [1,2,3,4] |
当b = a拷贝时,实际上拷贝的是a的堆地址1,而不是里面的值
key | val |
---|---|
a | 堆地址1 |
b | 堆地址1 |
所以当对a[0] = 1进行修改时,b因为跟a用的是同一个地址,所以b也会跟着修改,这就是浅拷贝