结构化克隆算法

结构化克隆算法用于复制复杂的 JavaScript 对象。它在调用 structuredClone() 时在内部使用,用于通过 postMessage()Worker 之间传输数据,使用 IndexedDB 存储对象,或为 其他 API 复制对象。

它通过递归遍历输入对象来克隆,同时维护一个先前访问过的引用的映射,以避免无限遍历循环。

结构化克隆不支持的功能

  • Function 对象无法被结构化克隆算法复制;尝试这样做会抛出 DataCloneError 异常。
  • 克隆 DOM 节点同样会抛出 DataCloneError 异常。
  • 某些对象属性不被保留
    • RegExp 对象的 lastIndex 属性不被保留。
    • 属性描述符、setter、getter 以及类似的元数据功能不会被复制。例如,如果一个对象使用 属性描述符标记为只读,那么在复制的对象中它将是读/写的,因为这是默认行为。
    • 原型链不会被遍历或复制。
    • 类私有元素不会被复制。(尽管内置类型的内部字段可能会。)

支持的类型

JavaScript 类型

错误类型

对于 Error 类型,错误名称必须是以下之一:ErrorEvalErrorRangeErrorReferenceErrorSyntaxErrorTypeErrorURIError(否则将设置为 "Error")。

浏览器必须序列化 namemessage 属性,并期望序列化错误的其他“有趣”属性,如 stackcause 等。

AggregateError 的支持预计将在 whatwg/html#5749 中添加到规范中(并且在某些浏览器中已得到支持)。

Web/API 类型

注意: 可序列化的对象在 Web IDL 文件中用 [Serializable] 属性进行标记。

另见