5月27日 01:06

什么是深拷贝?什么是浅拷贝?

浅拷贝只复制对象的第一层属性,如果属性值是引用类型(对象、数组),拷贝的是引用地址——修改拷贝会影响原对象。深拷贝递归复制所有层级,新旧对象完全独立。

javascript
// 浅拷贝 const obj = { a: 1, b: { c: 2 } }; const shallow = { ...obj }; // 或 Object.assign({}, obj) shallow.b.c = 3; console.log(obj.b.c); // 3 — 原对象被影响! // 深拷贝 const deep = JSON.parse(JSON.stringify(obj)); // 最简单的方式

... 展开和 Object.assign 都只做浅拷贝。JSON.parse(JSON.stringify(...)) 能做深拷贝但有局限:无法处理 undefined、函数、DateRegExp、循环引用。

追问

JSON 方式深拷贝有哪些坑?

  • undefined、函数、Symbol 直接被丢弃
  • NaNInfinity 变成 null
  • Date 变成字符串
  • RegExp 变成空对象 {}
  • 循环引用直接报错
  • 原型链丢失

生产环境怎么实现深拷贝?

  • structuredClone()(浏览器原生 API,支持循环引用、Date、Map、Set 等,但不支持函数和 DOM 节点)
  • lodash 的 cloneDeep
  • 自己实现递归拷贝 + WeakMap 处理循环引用(面试手写题常考这个)

手写深拷贝时循环引用怎么处理?

用 WeakMap 缓存已拷贝过的对象。每次拷贝前检查是否已经拷贝过,如果拷贝过直接返回缓存值。

标签:前端