Worker中解构event.data需在self.onmessage回调内进行,仅适用于结构化可克隆对象;应加默认值、重命名及类型校验,ArrayBuffer等二进制数据不可解构。

在 Worker 线程中接收主线程发来的消息时,可以直接用对象解构提取 event.data 中的字段,语法和主线程完全一致,但需注意两点:一是必须写在 self.onmessage 回调里,二是解构目标必须是结构化可克隆的对象(不能是函数、DOM 节点等)。
Worker 中直接解构 event.data
主线程发送的是普通对象(如 { type: 'sort', list: [3, 1, 4] }),Worker 可以在 onmessage 回调中用解构快速取值:
self.onmessage = ({ data: { type, list } }) => {
if (type === 'sort') {
const result = [...list].sort((a, b) => a - b);
self.postMessage({ type, result });
}
};这里用了嵌套解构:{ data: { type, list } } 直接从 MessageEvent 对象中取出 data,再从中解出 type 和 list,省去中间变量。
带默认值和重命名的解构更稳妥
实际场景中数据结构可能不完整,建议加上默认值或安全重命名:
- 用
data = {}防止undefined报错 - 用
payload重命名避免和内置data混淆 - 对数组字段加默认空数组
items = []
self.onmessage = ({ data: payload = {} }) => {
const { type = '', items = [], id } = payload;
if (type === 'process' && items.length > 0) {
const sum = items.reduce((a, b) => a + b, 0);
self.postMessage({ id, sum });
}
};解构前先校验数据类型
解构本身不校验类型,如果主线程误传了非对象(比如字符串或 null),会静默失败或报错。推荐加一层判断:
- 用
typeof payload === 'object' && payload !== null初步过滤 - 对关键字段用
Array.isArray(items)显式检查 - 避免直接解构
payload.items.map类操作,先确保存在
self.onmessage = (e) => {
const payload = e.data;
if (typeof payload !== 'object' || payload === null) return;
<p>const { type, config } = payload;
if (type === 'render' && config && typeof config === 'object') {
// 安全使用 config 中的字段
self.postMessage({ ok: true });
}
};</p>不适用解构的场景要绕开
以下情况不能依赖解构,需改用传统访问方式:
- 传入的是
ArrayBuffer或TypedArray—— 它们是二进制数据,不是普通对象,解构无效 - 数据经过
Transferable转移后只剩原始 buffer,没有键名可解 - 主线程传的是 JSON 字符串(没解析)—— 需先
JSON.parse()再解构
例如收到 ArrayBuffer 时,应直接构造视图:const view = new Uint8Array(buffer),而不是尝试 { length } = buffer。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











