示例说明
用 structuredClone 深克隆对象,旧运行时回退到手动克隆,处理循环引用和类型化数组。本示例属于数据完整性场景,提供可直接复制使用的javascript代码片段,附带边界条件与使用注意事项。
技术要点
- structuredClone 原生支持循环和类型化数组
- WeakMap 回退处理循环引用
- Date Map Buffer 等特殊类型单独处理
代码解读
上述代码实现了用 structuredClone 的深克隆的核心逻辑。用 structuredClone 深克隆对象,旧运行时回退到手动克隆,处理循环引用和类型化数组。代码中包含输入校验、核心算法和结果返回三个部分。关键在于正确处理边界情况,例如空输入、非法参数和并发场景。structuredClone 原生支持循环和类型化数组,WeakMap 回退处理循环引用。这些设计确保代码在生产环境中的健壮性。
使用建议
在实际项目中使用本示例时,建议先理解用 structuredClone 的深克隆的适用场景与限制条件。Date Map Buffer 等特殊类型单独处理。根据具体业务需求调整参数配置,并编写单元测试覆盖正常路径与边界情况。本代码片段可直接集成到现有项目中,或作为参考实现自行扩展。
代码示例
export function deepClone(obj){if(typeof structuredClone==='function'){try{return structuredClone(obj);}catch{}}return cloneFallback(obj,new WeakMap());}function cloneFallback(obj,seen){if(obj===null||typeof obj!=='object')return obj;if(seen.has(obj))return seen.get(obj);if(Array.isArray(obj)){const arr=[];seen.set(obj,arr);for(const i of obj)arr.push(cloneFallback(i,seen));return arr;}if(Buffer.isBuffer(obj))return Buffer.from(obj);if(obj instanceof Date)return new Date(obj);if(obj instanceof Map){const m=new Map();seen.set(obj,m);for(const[k,v]of obj)m.set(cloneFallback(k,seen),cloneFallback(v,seen));return m;}const clone={};seen.set(obj,clone);for(const[k,v]of Object.entries(obj))clone[k]=cloneFallback(v,seen);return clone;}