深拷贝的实现
方法一
JSON.parse(JSON.stringify(obj))
这种方式比较方便,但是会有一些局限性
1. 只能是普通对象,对象中不能包含特殊结构,否则都会转成普通对象
// 对象中包含特殊结构
const obj = {
a: 1,
b: 2,
c: new Map(),
};
function deepClone(obj) {
return JSON.parse(JSON.stringify(obj));
};
console.log(deepClone(obj));
2. 如果包含函数会被丢弃
const obj = {
a: 1,
b: 2,
c: function() {},
};
function deepClone(obj) {
return JSON.parse(JSON.stringify(obj));
};
console.log(deepClone(obj));
3. 如果包含递归引用,会报错
const obj = {
a: 1,
b: 2,
};
obj.c = obj;
function deepClone(obj) {
return JSON.parse(JSON.stringify(obj));
};
console.log(deepClone(obj));
方法二
通过遍历、递归的方式实现
class Test {
constructor() {
this.a = 1;
this.b = 2;
}
c() {
console.log('c');
}
}
Test.prototype.d = 3;
const obj = new Test();
function deepClone(value) {
if (typeof value !== 'object' || value === null) {
return value;
}
// value 是对象
const result = Array.isArray(value) ? [] : {};
Object.setPrototypeOf(result, Object.getPrototypeOf(value));
for (let key in value) {
if (value.hasOwnProperty(key)) {
result[key] = deepClone(value[key]);
}
}
return result;
};
console.log(deepClone(obj));