js手写一个深拷贝

71 阅读1分钟

以下是一个实现深拷贝的 JavaScript 函数:

function deepClone(obj) {
  // 如果是基本数据类型,直接返回
  if (obj === null || typeof obj !== 'object') {
    return obj;
  }

  // 创建一个新对象或数组,保持原对象的类型
  let copy;
  if (obj instanceof Array) {
    copy = [];
  } else {
    copy = {};
  }

  // 遍历原对象的属性或数组的元素
  for (let key in obj) {
    // 忽略原型链上的属性
    if (obj.hasOwnProperty(key)) {
      // 递归调用,对每个元素或属性值进行深拷贝
      copy[key] = deepClone(obj[key]);
    }
  }

  return copy;
}

// 示例用法
const obj1 = {
  a: 1,
  b: [2, 3],
  c: { d: 4 },
  e: new Date(), // 深拷贝特殊对象
  f: function () {}, // 函数在深拷贝中会丢失其行为
  g: new RegExp('test') // 正则表达式等也会被拷贝
};

const obj2 = deepClone(obj1);

console.log(obj2);

这个函数通过递归的方式对嵌套的对象和数组进行深拷贝,对于基本数据类型直接返回。需要注意的是,在 JavaScript 中,像函数和某些特殊对象(如 DateRegExp 等)的深拷贝处理可能需要注意一些细节,这个示例代码在拷贝这些对象时可能不会完全保留其所有特性,但可以作为一个基础的深拷贝实现来学习和调整。