浅拷贝和深拷贝的区别:
基础类型两者一致,如果是引用类型,则不同。
浅复制会导致复制前后,指向同一块内存地址,复制前后相互影响;
深复制是开辟一块新的内存地址,复制前后互不影响。
举个例子,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝(同源,一动全动),如果B没变,那就是深拷贝(不同源,互不影响)。
下面介绍几种实现深拷贝的方法
(这里的拷贝仅限于简单的对象,不包含含有方法的对象,这里埋个坑,考虑一下含有方法的情况)
1.递归的方式实现深拷贝
function deepCopy(obj) {
let result = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object') {
result[key] = deepCopy(obj[key]); //递归复制
} else {
result[key] = obj[key];
}
}
}
return result;
}
let items = ['11', '22', '33', '44'];
let itemsCopy = deepCopy(items);
itemsCopy[0] = 'aaa';
console.log('items--->' + items);//items--->11,22,33,44
console.log('itemsCopy--->' + itemsCopy);//itemsCopy--->aaa,22,33,44
2.通过JSON对象实现深拷贝
let items = ['11', '22', '33', '44'];
let _obj = JSON.stringify(items);
let itemsCopy = JSON.parse(_obj);
itemsCopy[0] = 'aaa';
console.log('items--->' + items);//items--->11,22,33,44
console.log('itemsCopy--->' + itemsCopy);//itemsCopy--->aaa,22,33,44
3.通过Object.assign实现深拷贝
当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝
let items = ['11', '22', '33', '44'];
let itemsCopy = Object.assign([], items);
itemsCopy[0] = 'aaa';
console.log('items--->' + items);//items--->11,22,33,44
console.log('itemsCopy--->' + itemsCopy);//itemsCopy--->aaa,22,33,44
注意:Object.assign实现深拷贝,只深复制了基本类型数据类型,不是真正意义的深复制
let items = ['11', '22', '33', ['44','55']];
let itemsCopy = Object.assign([], items);
itemsCopy[3][0] = 'bbb';
console.log(items);
console.log(itemsCopy);
如图,拷贝的对象最后一项是数组对象,使用Object.assign拷贝,最后一项就是浅拷贝了。
Object.assign实现拷贝慎用!!!
4.其他第三方库实现的拷贝
(1)通过jQuery的extend方法实现深拷贝
(2)lodash函数库实现深拷贝