1.最简单的方法,序列号反序列化一遍就好了,但是会丢失function,undefined或者NaN的属性
JSON.parse(JSON.stringify(xxx));
2.自己写一个方法,遍历获取属性
function deepClone(obj) {
let objClone;
if (obj && (obj.constructor == Object || obj.constructor == Array)) {
objClone = new obj.constructor();
} else {
return obj;
}
for (const key in obj) {
if ({}.hasOwnProperty.call(obj, key)) {
objClone[key] = deepClone(obj[key]);
}
}
return objClone;
}
后续百度了发现还有其他方法,在这补充一下
原文:https://zhuanlan.zhihu.com/p/78234841
3.通过Object.getPrototypeOf() 获取目标对象的原型,通过Object.assign()生成一个新的对象
function deepclone(target) {
if (typeof target !== "object") return target;
return Object.assign(
{},
Object.create(Object.getPrototypeOf(target)),
target
);
}
4.通过Object.getPrototypeOf() 获取目标对象的原型,通过扩展运算符以及proto来实现深度克隆(仅适用于浏览器端)
function deepclone(target) {
if (typeof target !== "object") return target;
return {
__photo__: Object.getPrototypeOf(target),
...target
};
}