Yasin

Yasin

浅拷贝和深拷贝

浅拷贝(Shallow Copy)

只复制第一层属性;如果属性值是对象/数组,复制的是引用地址
所以修改嵌套对象会互相影响。

const obj1 = {
  name: "Alice",
  info: { age: 18 },
};

const obj2 = { ...obj1 }; // 或 Object.assign({}, obj1)

obj2.name = "Bob"; // 不影响 obj1.name
obj2.info.age = 20; // 会影响 obj1.info.age(同一引用)

console.log(obj1.name); // Alice
console.log(obj1.info.age); // 20

常见浅拷贝方式:

  • Object.assign({}, obj)
  • 展开运算符 { ...obj }
  • 数组:arr.slice()[...arr]

深拷贝(Deep Copy)

递归复制所有层级,嵌套对象也会创建新引用。
修改副本不会影响原对象。

const obj1 = {
  name: "Alice",
  info: { age: 18 },
};

const obj2 = structuredClone(obj1); // 推荐(现代环境)

obj2.info.age = 20;

console.log(obj1.info.age); // 18
console.log(obj2.info.age); // 20

常见深拷贝方案对比

  1. structuredClone(obj)(推荐)
  • 支持大多数常见类型
  • 不支持函数、DOM 节点等
  1. JSON.parse(JSON.stringify(obj))
  • 简单,但有缺陷:
    • 丢失 undefinedsymbol、函数
    • Date 变字符串
    • 不能处理循环引用
const a = {
  d: new Date(),
  fn: () => {},
  u: undefined,
};

const b = JSON.parse(JSON.stringify(a));
console.log(b); // { d: "..." },fn/u 丢失

一句话

  • 浅拷贝:只拷贝第一层,嵌套对象共享引用。
  • 深拷贝:所有层级都复制,互不影响。