1. 浅拷贝和深拷贝的区别?
浅拷贝是指创建一个新的对象,这个新对象的属性与原对象的属性相同。但是,如果属性是引用类型(如数组、对象等),浅拷贝只会复制这些引用类型的地址,而不是它们所指向的数据。因此,原对象和拷贝对象会共享同一份引用类型的数据。这意味着改变拷贝对象中的引用类型属性时,也会影响到原对象。
深拷贝则是递归地复制对象及其所有的层级,无论是基本数据类型还是引用类型,都会创建全新的副本。这意味着修改深拷贝得到的新对象,不会影响到原对象。
总结
- 浅拷贝:只复制一层,对于嵌套的对象或数组,仍然保持引用。
- 深拷贝:完全复制所有层次,包括嵌套的对象或数组,使得源对象和拷贝对象完全独立。
2. 浅拷贝常用方法及示例:
数组浅拷贝方法:slice(),concat(),扩展运算符 ...
对象浅拷贝方法: Object.assign(),扩展运算符 ...
浅拷贝示例:
const dataSource = {a:1,b:{c:8}};
const arr1 = [{a:1,b:2},{a:3,b:4}]
let obj = {...dataSource}
obj.b.c = 78
let newArr = Object.assign({},arr1);
newArr[0].a = 5
编辑
3. 深拷贝常用方法及实现:
深拷贝方法:使用JSON方法,第三方库 比如 lodash的_.cloneDeep方法,手写递归实现。
function deepClone(oobj) {
let cloneObj = Array.isArray(oobj) ? [] : {};
for (const key in oobj) {
if(typeof oobj[key] == 'object'){
cloneObj[key] = deepClone(oobj[key])
} else {
cloneObj[key] = oobj[key]
}
}
return cloneObj
}