结构化克隆算法(Structured Cloning Algorithm)是用于复制复杂 JavaScript 对象的算法,广泛应用于postMessage()、IndexedDB、Worker数据传递等场景。它支持的对象类型如下,同时也有明确的不支持类型:

一、支持的对象类型
基本数据类型

  • 字符串(String)

  • 数字(Number,包括 NaN、Infinity)

  • 布尔值(Boolean)

  • null、undefined

  • 结构化对象

  • 对象字面量(Object)

  • 数组(Array)

  • 日期(Date):会被复制为新的 Date 实例,值与原对象相同

二进制数据类型

  • ArrayBuffer

  • TypedArray(如 Uint8Array、Float64Array 等)

  • DataView

  • 正则表达式(RegExp):复制时会保留 pattern 和 flags,但 lastIndex 属性不会被复制

  • Map:键值对会被递归复制

  • Set:元素会被递归复制

  • 错误对象(Error 及其子类,如 TypeError、RangeError 等):部分环境支持,复制时会保留错误消息和堆栈信息

可克隆的对象类型

  • 由Object.create()创建的对象

  • 符合结构化克隆要求的自定义对象(需通过特定方式实现,较罕见)

二、不支持的对象类型

  • 函数(Function):无法克隆,会抛出错误

  • Symbol:作为属性键或值时均不支持

  • DOM 节点:如document、Element等 DOM 对象

  • WeakMap/WeakSet:由于其弱引用特性,无法被结构化克隆

  • 循环引用对象:虽然部分实现(如现代浏览器)已支持有限的循环引用,但标准中不保证支持

  • 某些特殊对象:如Proxy、Promise、Generator等

核心特点

  • 递归复制:会深度克隆对象的所有嵌套属性(前提是嵌套类型也被支持)。

  • 与 JSON 序列化的区别:比JSON.stringify()支持更多类型(如 Date、Map、二进制数据等),但仍有局限性(如不支持函数)。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐