JavaScript中对象深拷贝的实现方法

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);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容