structuredClone()可安全深拷贝含Blob/File/FormData等对象的表单数据,但需确保浏览器支持(Chrome 98+/Firefox 97+/Safari 15.4+/Node.js 17.0+),对不支持环境需降级处理;克隆要求Blob/File为原生实例,元数据应独立存储;克隆后Blob引用有效,但object URL需重新生成;FormData需先转为键值对再克隆。
structuredClone() 可以安全深拷贝包含 Blob、File、FormData、Map、Set 等可转移对象的表单数据,但需注意浏览器兼容性与特殊限制。
structuredClone() 在现代浏览器(Chrome 98+、Firefox 97+、Safari 15.4+)中可用,Node.js 17.0+ 也支持。若需兼容旧环境,应降级使用 Blob.slice() 手动重建 Blob,或借助 FileReader + ArrayBuffer 序列化再反序列化。
structuredClone 要求原始对象中的 Blob/File 必须是“可结构化克隆”的值——即原生实例,而非被 Proxy 包裹、或经自定义属性扩展的对象。例如,直接从 input[type="file"].files[0] 获取的 File 实例可被克隆;但若手动添加了 .customId 等属性,克隆后该属性会丢失(structuredClone 不保留非自有可枚举属性)。
{ file: input.files[0], metadata: { id: 'xxx', tag: 'avatar' } }
structuredClone 会创建新的 Blob/File 实例,其内容与原实例共享底层字节(通过内部引用计数),因此克隆后的 Blob 仍可正常读取、上传或转为 URL(URL.createObjectURL())。但注意:克隆不会复制已生成的 object URL,需对新 Blob 单独调用 URL.createObjectURL()。
structuredClone 本身不支持直接克隆 FormData(它不是可结构化类型),但可先将其转换为普通对象或数组,再克隆。推荐方式是遍历 FormData.entries(),提取键值对,对 Blob/File 值直接保留,其他值按需处理: