深拷贝:

  1. 递归实现

通过递归遍历对象的每一个属性,然后进行复制,如果属性值是对象,则递归复制,这样就能够实现深拷贝。

function deepCopy(obj) {
  if (typeof obj !== 'object') return obj;

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

  for (let key in obj) {
    newObj[key] = deepCopy(obj[key]);
  }

  return newObj;
}
  1. JSON 方法

利用 JSON 对象的 stringify 和 parse 方法,将对象转换为 JSON 字符串,然后再将字符串转换为对象,这样就能够实现深拷贝。

function deepCopy(obj) {
  return JSON.parse(JSON.stringify(obj));
}

但是这种方法有一些限制,例如对象中不能有函数、正则表达式等特殊类型的属性,否则会被转换为 null。

浅拷贝:

  1. Object.assign 方法

Object.assign 方法可以将源对象的属性复制到目标对象中,如果目标对象中已经存在同名属性,则会被覆盖。

const obj1 = { a: 1, b: 2 };
const obj2 = Object.assign({}, obj1);

console.log(obj2); // { a: 1, b: 2 }
  1. 扩展运算符

扩展运算符可以将一个对象的属性展开到另一个对象中,语法比 Object.assign 更加简洁易懂。

const obj1 = { a: 1, b: 2 };
const obj2 = { ...obj1 };

console.log(obj2); // { a: 1, b: 2 }

但是需要注意的是,这种方法只能进行浅拷贝,如果源对象中有嵌套的对象,则只会复制引用,而不会复制对象本身。


原文地址: https://www.cveoy.top/t/topic/mVo 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录