法一:有局限性
//通过js的内置对象JSON来进行数组对象的深拷贝
function deepClone(obj: any): any {
const _obj = JSON.stringify(obj),
const objClone = JSON.parse(_obj);
return objClone;
}
这种简单粗暴的方法有其局限性,当值为undefined、function、symbol 会在转换过程中被忽略
法二:Object.assign()
针对深拷贝,需要使用其他办法,因为 Object.assign()
拷贝的是(可枚举)属性值。个人理解 Object.assign() 只会拷贝一层结构
const log = console.log;
function test() {
'use strict';
let obj1 = { a: 0 , b: { c: 0}};
let obj2 = Object.assign({}, obj1);
log(JSON.stringify(obj2));
// { a: 0, b: { c: 0}}
obj1.a = 1;
log(JSON.stringify(obj1));
// { a: 1, b: { c: 0}}
log(JSON.stringify(obj2));
// { a: 0, b: { c: 0}}
obj2.a = 2;
log(JSON.stringify(obj1));
// { a: 1, b: { c: 0}}
log(JSON.stringify(obj2));
// { a: 2, b: { c: 0}}
obj2.b.c = 3;
log(JSON.stringify(obj1));
// { a: 1, b: { c: 3}}
log(JSON.stringify(obj2));
// { a: 2, b: { c: 3}}
// Deep Clone
obj1 = { a: 0 , b: { c: 0}};
let obj3 = JSON.parse(JSON.stringify(obj1));
obj1.a = 4;
obj1.b.c = 4;
log(JSON.stringify(obj3));
// { a: 0, b: { c: 0}}
}
test();
法三:利用循环和递归
public deepClone(target: any): any {
if (target == null) {
return null;
}
const cloneObject = new target.constructor();
Object.keys(target).forEach(
(attr: string) => {
cloneObject[attr] = (typeof target[attr] === 'object') ? this.deepClone(target[attr]) : target[attr];
}
);
return cloneObject;
}
标签:obj1,stringify,obj2,log,js,JSON,深度,拷贝,target From: https://blog.51cto.com/u_12374018/6195458