web worker 中深拷贝应优先使用 structuredclone():它原生支持 date、regexp、map、set 等,自动处理循环引用,chrome 98+ 等主流浏览器已支持;次选 messagechannel 模拟克隆;不推荐手写递归。

在 Web Worker 环境中实现深拷贝,核心不是“手动复制”,而是利用浏览器原生支持的结构化克隆(structured cloning)机制——它本身就是为跨线程安全传值而设计的。
Worker 间传值天然依赖结构化克隆
调用 postMessage(data, transferList?) 时,浏览器自动对 data 执行结构化克隆(非 JSON 序列化)。这意味着:
- 支持
Date、RegExp、Map、Set、ArrayBuffer、TypedArray、Error、循环引用等 - 不支持
function、undefined、Symbol、DOM 节点、WeakMap/WeakSet - 若传入不支持的类型,会直接抛出
DataCloneError
structuredClone() 在 Worker 中完全可用
Chrome 98+、Firefox 94+、Safari 15.4+ 的 Worker 内可直接使用:
const copy = structuredClone(originalObj);- 它是同步操作,适用于主线程和 Worker,且自动处理循环引用
- 比手写递归更可靠,也比
JSON.parse(JSON.stringify())更完整
MessageChannel 是更底层的可控方案
当需要精确控制克隆时机或兼容稍旧环境(如部分 Node.js Worker),可用 MessageChannel 模拟一次“空投”:
- 创建
new MessageChannel(),取port1发送、port2接收 - 发送后立即监听
port2.onmessage,收到即为深拷贝结果 - 本质是触发一次结构化克隆,但需 Promise 封装,有微小异步开销
不推荐在 Worker 中手写递归深拷贝
除非有强定制需求(如过滤字段、转换特定类型),否则没必要:
- Worker 已原生支持
structuredClone,无需 polyfill - 手写易漏
Map/Set迭代、ArrayBuffer切片、WeakMap缓存等细节 - 性能不如原生 API,且无法真正支持转移对象(
transfer参数)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











