深拷贝和浅拷贝是在JS中经常使用的概念,用于描述对象或数组等引用类型的复制。
浅拷贝只是复制了原始对象的引用,而不是复制实际的值。因此,当修改副本时,原始对象的相应值也会改变。
深拷贝是将原始对象的所有值都复制到新对象中,而不是仅仅复制引用。因此,修改副本不会影响原始对象。
在JS中,可以使用以下几种方法来进行深拷贝或浅拷贝:
浅拷贝:
1、Object.assign()方法
let obj1 = { a: 1, b: 2 };
let obj2 = Object.assign({}, obj1);
2、扩展操作符
let obj1 = { a: 1, b: 2 };
let obj2 = { ...obj1 };
3、数组的slice()、concat()方法
let arr1 = [1, 2, 3];
let arr2 = arr1.slice(); // 或者arr1.concat()
深拷贝:
1、JSON.parse()和JSON.stringify()方法(适用于没有函数、日期等特殊类型的对象)
let obj1 = { a: 1, b: 2 };
let obj2 = JSON.parse(JSON.stringify(obj1));
2、lodash库中的_.cloneDeep()方法(适用于所有类型的对象)
let obj1 = { a: 1, b: { c: 2 } };
let obj2 = _.cloneDeep(obj1);
3、自己封装
const obj = {
name: 'longge',
age: 16,
arr: [],
o: { a: 1, b: 2 },
f: function () {},
c: undefined,
d: new Date(),
}
function deepClone(obj) {
//如果对象为null或者undefined,直接返回
if (obj == null) return obj
//如果对象是Date类型,创建一个新的Date对象并返回
if (obj instanceof Date) return new Date(obj)
//如果是简单数据类型,直接返回
if (typeof obj !== 'object') return obj
// 如果obj 是对象或数组
//创建一个新的空对象或数组,使用与原对象相同的构造函数
const newObj = new obj.constructor()
// 遍历原对象的属性
for (let k in obj) {
// 递归调用deepClone函数,对属性值进行深拷贝
newObj[k] = deepClone(obj[k])
}
return newObj //返回克隆后的新对象
}
const newObj = deepClone(obj)