structuredClone不支持哪些对象?非普通对象具体指什么?
structuredClone 不支持的对象类型详解
首先澄清你提到的类实例问题:MDN说的「普通对象」特指无自定义原型链的对象字面量,但structuredClone并非完全不能处理类实例——它能克隆类实例,但会丢弃类的原型、方法,只保留实例的可枚举自有属性,相当于把实例“降级”成了普通对象。
下面是structuredClone明确不支持的对象/类型,碰到这些会直接抛出DataCloneError,或者丢失数据:
函数/方法:不管是对象里的方法、类的原型方法,还是独立函数,都无法被克隆。比如:
const obj = { greet: () => 'hello' }; structuredClone(obj); // 抛出 DataCloneErrorSymbol作为键的属性:如果对象用Symbol做属性名,克隆后的对象会直接丢失这些属性,结构化克隆不处理Symbol键。
DOM节点:像
document.querySelector('div')这类浏览器DOM元素,属于宿主对象,不在结构化克隆的支持范围内,克隆会报错。部分内置对象实例:
Error及其子类(比如TypeError、RangeError):克隆这类实例会直接报错RegExp:虽然不会报错,但克隆后的正则会丢失lastIndex属性WeakMap、WeakSet:因为它们依赖弱引用机制,完全不支持克隆- 如果
Map/Set里存了函数、DOM节点这类不支持的元素,整个克隆操作都会失败
不可枚举的自有属性:结构化克隆只会复制对象的可枚举自有属性,类实例里的不可枚举属性(比如通过
Object.defineProperty定义的不可枚举属性)会被忽略。
另外补充下和JSON.parse(JSON.stringify())的差异:后者不仅不支持循环引用,还会把undefined、NaN、Infinity转成null,而structuredClone支持这些值,但上述不支持的类型是它的硬伤。
内容的提问来源于stack exchange,提问作者user12273078
相关产品推荐
相关产品推荐

