You need to enable JavaScript to run this app. 为何更换Blob配置项的传入变量名会触发DOMException类型不匹配报错
优惠活动
大模型
产品
解决方案
定价
更多

为何更换Blob配置项的传入变量名会触发DOMException类型不匹配报错

问题本质:被忽略的JS对象简写语法规则

这和type是不是JS保留字、浏览器API有特殊硬编码逻辑完全无关,核心是第二段代码对JS 对象属性简写规则 的错误套用,导致生成的Blob根本没有被设置正确的MIME类型。

具体逻辑拆解

  • 先明确JS ES6引入的对象简写规则:当你在对象字面量里直接写一个变量名,没有显式指定对应键名时,JS会自动创建一个和变量名完全同名的键,把变量的值作为这个键的取值。比如写法{ type },本质完全等价于{ type: type }。
  • 第一段代码能正常运行,刚好是适配了这个规则:
    你定义了变量type = 'text/plain',写new Blob([text], { type })时,实际传给Blob构造函数的配置对象是{ type: 'text/plain' }。Blob构造函数只会读取配置对象里的type键,用来设置自身的MIME类型,所以最终生成的Blob的type属性值就是'text/plain',和后续ClipboardItem里通过动态键传入的MIME类型完全匹配,整个流程自然能跑通。
  • 第二段代码报错的核心偏差就在这里:
    你把变量名换成了anotherName,值还是'text/plain',但写new Blob([text], { anotherName})时,按照简写规则,实际生成的配置对象根本不是Blob要求的结构,而是{ anotherName: 'text/plain' }。
    Blob构造函数只会识别配置对象里固定叫type的属性,对这个自定义的anotherName键会完全忽略。此时生成的Blob根本没有被设置MIME类型,它的type属性值是空字符串,也就是默认的未知二进制流类型。

错误触发的完整链路

等执行到new ClipboardItem({ [anotherName]: blob })这步时,相当于动态生成了键为text/plain的映射关系,值就是刚才那个MIME类型为空的Blob。
ClipboardItem的内部校验逻辑会逐一比对传入的键名和对应Blob的实际MIME类型,发现两边不匹配(键名要求是text/plain,但Blob实际类型是空字符串),就抛出了你看到的Type text/plain does not match the blob's type错误。

快速验证方法

你可以在报错的代码片段里手动打印Blob的实际类型,就能直观看到问题所在:

var text="copy me"
var anotherName= 'text/plain';
var blob = new Blob([text], { anotherName});
console.log(blob.type) // 控制台输出空字符串 '',并非预期的'text/plain'

使用自定义变量名的正确写法

如果你不想用type当变量名,只要不要在Blob的配置对象里依赖简写规则,显式把配置键写为Blob要求的type即可:

var text="copy me"
var anotherName= 'text/plain';
// 显式指定Blob配置的键为type,而非依赖简写逻辑
var blob = new Blob([text], { type: anotherName });
var data = [new ClipboardItem({ [anotherName]: blob })];
navigator.clipboard.write(data)

内容的提问来源于stack exchange,提问作者mondersky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.04 04:45:04