1. 使用 JSON.stringify() 和 JSON.parse()
这是一种简单但有局限性的方法,适用于能够被JSON格式化处理的对象(即对象中不包含函数、循环引用、undefined、Symbol、Date对象以外的内置对象等非标准JSON类型):
//javascript
function deepCopyUsingJson(obj) {
return JSON.parse(JSON.stringify(obj));
}
2. 使用递归函数
这种方法更通用,能够处理包含复杂嵌套和各种数据类型的对象,包括函数和循环引用(需额外处理):
//javascript
function deepCopyUsingRecursion(obj) {
if (obj === null || typeof obj !== 'object') {
return obj;
}
const copy = Array.isArray(obj) ? [] : {};
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
copy[key] = deepCopyUsingRecursion(obj[key]);
}
}
return copy;
}
3. 使用Object.assign()结合递归
如果支持现代浏览器或Node.js环境,可以利用Object.assign()结合递归来实现深拷贝,但同样需要注意处理数组和循环引用:
//javascript
function deepCopyUsingAssign(obj) {
if (obj === null || typeof obj !== 'object') {
return obj;
}
if (Array.isArray(obj)) {
return obj.map(deepCopyUsingAssign);
}
return Object.keys(obj).reduce((acc, key) => {
acc[key] = deepCopyUsingAssign(obj[key]);
return acc;
}, {});
}
4. 使用第三方库(如Lodash的_.cloneDeep())
若项目中已集成诸如Lodash这样的工具库,可以直接使用其提供的深拷贝函数,以简化代码并确保更好的兼容性和性能:
//javascript
import { cloneDeep } from 'lodash';
const deepCopyUsingLodash = cloneDeep(obj);