结构化克隆是 postmessage 默认自动执行的深拷贝机制,通过序列化→ipc传输→反序列化三步实现内存隔离;支持 object、array、date、map、arraybuffer 等类型,不支持 function、dom 节点等;大对象应使用 transferable 零拷贝转移。

在 Web Worker 通信中,深拷贝不是你主动“做”的操作,而是 postMessage 默认就用结构化克隆算法(Structured Clone Algorithm)自动完成的深拷贝。你不需要手动调用 structuredClone 来传数据——只要不显式使用 transferable,浏览器就会走这条路。
为什么默认就是深拷贝?
主线程调用 worker.postMessage(obj) 时:
- 浏览器内部自动启动结构化克隆算法,递归遍历整个对象树
- 所有可克隆类型(Object、Array、Date、RegExp、Map、Set、TypedArray、ArrayBuffer 内容等)都会被完整复制
- 原始对象和 Worker 收到的对象内存完全隔离,修改互不影响
- 这正是深拷贝的本质:值独立、引用断开
哪些数据能被结构化克隆?
支持的类型包括:
- 基础类型:
null、undefined、string、number、boolean、BigInt、Symbol(⚠️注意:Symbol在部分旧浏览器中不支持) - 对象类:
Object、Array、Date、RegExp、Map、Set、Error(仅属性,不保留原型方法) - 二进制类:
ArrayBuffer、TypedArray、DataView、ImageBitmap、AudioData - 其他:
URL、FormData、FileList、WebAssembly.Module
不支持的典型类型:function、undefined(在某些上下文中会被忽略)、DOM 节点、window、document、循环引用对象(会抛错)、Promise、Proxy、Generator。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
什么时候该用 structuredClone 主动调用?
只在两种明确场景下需要你显式调用 structuredClone():
-
提前克隆再传参:比如你想在主线程先备份一份数据用于比对,再发给 Worker,这时可先
const backup = structuredClone(original) -
Worker 内部再转发或缓存:Worker 收到消息后,想把它深拷贝一份存起来,或转给另一个 Worker / SharedWorker,就用
structuredClone(e.data)
注意:structuredClone 是 2022 年起逐步落地的原生 API,目前(2026 年)所有主流浏览器均已稳定支持。
大对象传输的性能提醒
虽然结构化克隆是自动深拷贝,但对几十 MB 的对象会明显卡顿:
- CPU:需遍历、序列化、反序列化全部字段
- 内存:主线程和 Worker 各持一份副本,瞬时双倍占用
- 替代方案:对
ArrayBuffer等可转移对象,用postMessage(data, [data.buffer])实现零拷贝转移——此时不是深拷贝,而是所有权移交,原主线程不能再访问该 buffer
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










