1、使用JSON方法
- 适用于对象中不包含函数、日期对象、undefined、Infinity、正则表达式等特殊类型数据的情况
function deepClone(obj) {
return JSON.parse(JSON.stringify(obj));
}
const testObj1={
arr:[],
a:4
};
testObj1.sub=testObj1;
testObj1.arr.push(testObj1)
console.log(testObj1);
const testObj2=JSON.parse(JSON.stringify(testObj1))
2、递归拷贝
function deepClone(obj, hash = new WeakMap()) {
if (obj === null) return null;
if (typeof obj !== 'object') return obj;
if (obj instanceof Date) return new Date(obj);
if (obj instanceof RegExp) return new RegExp(obj);
if (hash.has(obj)) return hash.get(obj);
let cloneObj = new obj.constructor();
hash.set(obj, cloneObj);
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
cloneObj[key] = deepClone(obj[key], hash);
}
}
return cloneObj;
}
3、使用Object.assign()
- Object.assign()通常用于浅拷贝,但结合使用可以实现深拷贝。需要注意的是,这种方法仅适用于对象中不包含特殊类型数据的情况
function deepClone(obj) {
return Object.assign({}, obj);
}
}
3、使用第三方库
- 在使用之前,我们可以用Console impoter这个浏览插件测试一下,确定好用之后咱再往项目里面用
- 安装好插件之后直接在浏览器控制台测试
const _ = require('lodash');
const original = { name: "Alice", age: 25, details: { height: 170, weight: 60 }, birth: new Date() };
const cloned = _.cloneDeep(original);
console.log(cloned);