var testA = {
x: 1,
y: { z: 1, g: 2 }
};
var testB = {};
Object.assign(testB, testA);
testA.y.z = 22;
console.log(testB);// 打印结果 testB.y.z =22
如上代码,如果想用Object.assign() 进行深拷贝是做不到的,官方文档如下:
Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
但是 因为 Object.assign()拷贝的是属性值。假如源对象的属性值是一个指向对象的引用,它也只拷贝那个引用值。
还有帖子说 用Json 序列化和反序列化 就可以做到,但是下面得代码你试试
var testA={
x:1,
y:{z:1,g:2}
h:(obj)=>{
console.log(obj);
}
}
//如上代码拷贝出来会变成如下这个样子
{
x:1,
y:{z:1,g:2}
}
//h 不见鸟,为咩呢?因为Json 格式受限. 不能将方法反序列化.
但是呢,终极解决方案如下:
function DeepCopy(object) {
let resultObject = {};
for (let obj in object) {
if (typeof (object[obj]) == "object" && !Array.isArray(object[obj])) {
let x = {}
x[obj] = DeepCopy(object[obj])
Object.assign(resultObject, x);
} else {
let x = {};
x[obj] = object[obj];
Object.assign(resultObject, x);
}
}
return resultObject;
}
自己去测试吧。