structuredclone 能正确处理 arraybuffer、typedarray、dataview、blob、file、imagedata 等二进制类型及包含它们的嵌套结构,但不支持函数、dom 节点等不可克隆值。

structuredClone 是 JavaScript 原生支持的深拷贝方法,能安全复制包含 ArrayBuffer、TypedArray、Blob、File、ImageData 等二进制数据的对象,无需手动序列化或依赖第三方库。
哪些二进制类型能被 structuredClone 正确处理
它原生支持以下含二进制内容的类型(在主流现代浏览器和 Node.js 18.13+ / 20.6+ 中可用):
-
ArrayBuffer和所有TypedArray(如Uint8Array、Float32Array) DataView-
Blob(注意:跨域 Blob 可能受限于安全策略) -
File(继承自Blob,同样受同源/权限限制) -
ImageData(Canvas 相关) - 包含上述类型的普通对象、数组、Map、Set、Date、RegExp 等嵌套结构
基本用法:直接传入含二进制的对象
只要目标对象可被结构化克隆(即不包含函数、undefined、Symbol、Promise、window 等不可克隆值),直接调用即可:
const original = {
name: "photo",
data: new Uint8Array([1, 2, 3, 4]),
buffer: new ArrayBuffer(8),
meta: new Map([["width", 1920], ["height", 1080]])
};
const cloned = structuredClone(original);
// cloned.data 和 original.data 是独立的 Uint8Array,修改互不影响
cloned.data[0] = 99;
console.log(original.data[0]); // 仍为 1
注意事项与常见问题
虽然能力强大,但需留意以下几点:
-
不支持函数、class 实例、DOM 节点、WebAssembly 对象:遇到会抛出
DataCloneError -
Blob/File 的克隆是“引用式复制”而非字节拷贝:克隆后的
Blob共享底层数据,但structuredClone保证其size、type、arrayBuffer()结果独立(调用arrayBuffer()后得到的是新 ArrayBuffer) -
性能考虑:大体积
ArrayBuffer(如百 MB 级图像数据)克隆会同步阻塞主线程,必要时可用Worker异步处理 -
Node.js 需启用 flag 或检查版本:Node.js 18 需启动时加
--enable-structured-clone;18.13+ 和 20.6+ 默认开启
替代方案(当 structuredClone 不可用时)
若需兼容旧环境(如 Safari 15.4 之前、Node.js 16),可降级处理:
- 对
ArrayBuffer/TypedArray:用.slice()或new Uint8Array(oldBuffer).slice() - 对
Blob:用new Blob([blob])创建副本(注意 MIME 类型会保留) - 对复杂嵌套对象:结合
JSON.parse(JSON.stringify())(仅限纯 JSON 数据) + 手动替换二进制字段
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











