js深度拷贝-工具函数

直接上代码段

function deepCopy(obj, visited = new WeakMap()) {
  if (visited.has(obj)) {
    return visited.get(obj);
  }

  if (obj === null || typeof obj !== 'object') {
    return obj;
  }

  if (obj instanceof Date) {
    return new Date(obj);
  }

  if (obj instanceof RegExp) {
    return new RegExp(obj);
  }

  const copyObj = Array.isArray(obj) ? [] : {};

  visited.set(obj, copyObj);

  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      copyObj[key] = deepCopy(obj[key], visited);
    }
  }

  return copyObj;
}
  1. 引入了一个visited参数,它是一个WeakMap,用于检查对象是否已经被复制,以防止循环引用.

        eg:

const originalObj = {
  name: 'John',
  age: 30,
  friends: ['Alice', 'Bob'],
};

const clonedObj = deepCopy(originalObj);
console.log(clonedObj);

 

在上面的示例中,obj1obj2 互相引用,形成了一个循环引用。当您尝试深拷贝 obj1 时,deepCopy 函数会检测到循环引用,并触发条件 if (visited.has(obj)),以避免陷入无限循环,并返回之前已经创建的克隆对象。

这就是条件 if (visited.has(obj)) 的触发情况的一个例子,它可以防止深拷贝陷入无限循环并导致栈溢出错误。

  1. 添加了对null、非对象以及特殊对象(例如DateRegExp)的检查和处理。
  2. 使用for...in循环替代Object.entries(),以提高性能。
  3. 使用hasOwnProperty来确保只复制对象自身的属性,而不是原型链上的属性。

      

你可能感兴趣的:(js工具函数,javascript,前端,开发语言)