跨环境对象克隆应分层策略:优先用structuredclone(支持map、set等且处理循环引用),降级用json方法(限纯数据),必要时用基于weakmap的递归实现,确保全环境兼容。

跨环境的对象克隆,核心是让克隆逻辑在不同运行时(如浏览器、Node.js、Web Worker、Service Worker)都能安全、一致地工作,同时兼容现代与旧版环境。关键不在“写一次”,而在“选对方法+兜底策略”。
优先用 structuredClone(现代环境首选)
这是目前最接近“开箱即用”的跨环境方案:原生支持 Map、Set、Date、RegExp、ArrayBuffer、TypedArray、Error、URL、FormData 等,还能正确处理循环引用。
- 浏览器中从 Chrome 98+、Firefox 94+、Safari 16.4+ 开始支持;Node.js 17.0+(需启用 --experimental-structured-clone)
- 在 Web Worker 和 Service Worker 中也原生可用,无需额外 polyfill
- 用法极简:
const cloned = structuredClone(original) - 注意:不支持函数、undefined、Symbol、BigInt(这些本就无法被结构化克隆序列化)
降级到 JSON 方法(简单数据 + 兼容性兜底)
当目标环境不支持 structuredClone 时,JSON.parse(JSON.stringify(obj)) 仍是最快、最轻量的 fallback 方案,但必须明确其边界:
- 仅适用于纯数据对象:不含函数、undefined、Symbol、RegExp、Date(会被转成字符串)、Map/Set 等
- 会丢失原型链和不可枚举属性
- 遇到循环引用直接抛错,需提前检测或放弃
- 适合配置项、API 响应体、表单数据等结构扁平、类型受限的场景
需要完整能力时,用可移植的递归实现
若业务必须保留函数、Date、RegExp、循环引用等,且不能引入第三方库,可封装一个轻量递归 deepClone 函数,并确保它不依赖 DOM 或 Node.js 特有 API(如 Buffer):
- 只使用标准 ECMAScript API(
Object.prototype.toString、Array.isArray、instanceof、WeakMap) - 用
WeakMap记录已克隆对象,解决循环引用(WeakMap在所有现代 JS 环境中都存在) - 对 Date、RegExp、Map、Set 等内置类型做显式构造(
new Date(obj)、new RegExp(obj)等) - 避免使用
eval、Function构造器或require,保证跨环境执行安全
生产环境推荐组合策略
真正可靠的跨环境克隆不是靠单一方法,而是分层判断:
- 先检测
typeof structuredClone === 'function',支持则直接用 - 否则检查数据是否为纯 JSON 友好结构(可写个简易校验函数),满足则走 JSON 路径
- 其余情况调用自研递归克隆函数,或按需加载轻量 polyfill(如
core-js/stable/structured-clone) - 不建议在跨环境项目中直接依赖 Lodash 的
_.cloneDeep,因其内部可能使用 Node.js Buffer 或其它环境特有逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











