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、函数、Date、RegExp、循环引用。
追问
JSON 方式深拷贝有哪些坑?
undefined、函数、Symbol直接被丢弃NaN和Infinity变成nullDate变成字符串RegExp变成空对象{}- 循环引用直接报错
- 原型链丢失
生产环境怎么实现深拷贝?
structuredClone()(浏览器原生 API,支持循环引用、Date、Map、Set 等,但不支持函数和 DOM 节点)- lodash 的
cloneDeep - 自己实现递归拷贝 + WeakMap 处理循环引用(面试手写题常考这个)
手写深拷贝时循环引用怎么处理?
用 WeakMap 缓存已拷贝过的对象。每次拷贝前检查是否已经拷贝过,如果拷贝过直接返回缓存值。