!!!这里所说的深浅拷贝前提是引用数据类型
深浅拷贝的主要区别就是:是否真正获取一个对象的复制实体,而不是引用
假设B复制了A,修改A的时候,看B是否发生变化:
如果B跟着也变了,说明是浅拷贝,说明A和B的地址一样的,通过A的修改根本上修改的时A与B地址上的值。
如果B没有改变,说明是深拷贝,即A与B代表的是不同的地址,修改一个另一个不会改变!
- 浅复制:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。(负值时只需要直接将变量等于给另一个变量即可,浅复制只会将对象的各个属性进行复制)
- 深复制:在计算机中开辟一块新的内存地址用于存放复制的对象。
!!!使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。
实现深拷贝的方法:
1.递归实现深拷贝:
<script>
let obj = {
name: 'zw',
number: [10, 20],
fn: function () {
console.log(123);
},
old: {
one: '1',
two: "2"
}
}
// 说明一个函数
function copy(obj) {
var newobj = null;
//通过typeof判断是否为引用数据类型且不等于null
//如果等于null直接返回newobj
if (typeof (obj) === 'object' && obj !== null) {
newobj = obj instanceof Array ? [] : {}//这里创建一个新的引用数据类型用以合并和存放解析后的数据
//newobj = obj.isArray(obj)?[]:{};
for (const key in obj) {
newobj[key] = copy(obj[key])//递归实现对每一个引用数据类型解析并赋值给一个新创建的引用数据类型
}
}
else {
newobj = obj;//当解析到基本数据类型时即可以直接赋值。
}
return newobj;
}
let a = new copy(obj)
a.number[0] = 555
console.log(obj);
console.log(a);
</script>
核心思想:引用数据类型是有基本数据类型构成的,并且,基本数据类型是不存在深浅拷贝这一说的,那么我们只需要将引用数据类型的每一层次的基本数据类型赋值,并遍历到最深处的基本数据并赋值就可以完成深拷贝。
2.通过JSON的方法
const a = JSON.parse(JSON.stringify(数据))
//JSON.stringify(需要拷贝数据)转化为JSON字符串
//JSON.parse(JSON字符串) 将JSON数据格式的字符串转化为对象