理解
对象拷贝,就是将一个对象的属性拷贝到另一个有相同类型的对象中去,在程序中拷贝对象是很长见得,主要是在新的上下文环境中复用对象的部分或全部数据,js中有两种类型的对象拷贝,浅拷贝和深拷贝。
深浅拷贝的区别
官方:
深复制和浅复制最根本的区别在于是否是真正**获取了一个对象的复制实体* * ,而不是引用。
浅复制 —-只是拷贝了基本类型的数据,而引用类型数据,复制后也是会发生引用,我们把这种拷贝叫做“(浅复制)浅拷贝”,
换句话说,浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。
深复制 —-在计算机中开辟了一块新的内存地址用于存放复制的对象。
个人理解:
授人以鱼不如授人以渔
假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。
浅拷贝的实现
把字符串数字的值赋给新的变量,相当于把值全部复制过去,新变量的值不会影响旧变量的值。但是对象却不同,因为是复制地址,所以新的值也会影响旧的值。
let a= [1,2,3]
b=a.slice()
a[0]=2;
console.log(a,b)
注意:数组方法中的slice()、concat()和Object.assign()在第一层拷贝时看起来像深拷贝,但是如果再进行深层拷贝时就可以发现是浅拷贝,所以要注意。
深拷贝的实现
对象的赋值会相互影响,而数字,字符串之类的不会,我们将对象遍历,在数字、字符串将其对应赋值,这就是一般深拷贝的方式。
- 一般方法
- JSON对象的parse和stringify
- 递归
- jquery 有提供一个$.extend
具体实现可以看这篇参考