深拷贝
深拷贝是指复制一个对象时,不仅复制对象本身的属性,而且递归复制对象属性的值。通俗的说,深拷贝将一个对象完全复制一份,并且新对象的修改不会影响原对象。
实现深拷贝的方法有很多,以下是两种常见的方式:
- 递归实现深拷贝
通过递归遍历需要拷贝的对象,当遇到子对象时进行深度遍历,将子对象也进行深拷贝。可以通过判断变量类型的方法来实现区分,将除Object和Array外的其他类型直接赋值即可。
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') {
return obj;
}
let result = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
result[key] = deepClone(obj[key]);
}
}
return result;
}
- 利用JSON实现深拷贝
由于JSON数据格式本身就是能够表达JavaScript中的对象的语法,因此可以将复杂对象通过JSON.stringify()方法转化为JSON字符串,再通过JSON.parse()方法将JSON字符串转化为新的对象。由于JSON.stringify()方法会将对象中的函数和undefined值忽略掉,因此不适用于直接拷贝包含函数和undefined值的对象。
function deepClone(obj) {
return JSON.parse(JSON.stringify(obj));
}
需要注意的是,深拷贝可能会存在循环引用的问题,指向自身或指向同一个对象,这种情况需要进行特殊的处理,例如通过WeakMap来记录已经遍历过的对象,遇到已经遍历过的对象时直接返回对应的值。
forever young