结构化克隆算法
结构化克隆算法用于复制复杂的 JavaScript 对象。它在调用 structuredClone() 时在内部使用,用于通过 postMessage() 在 Worker 之间传输数据,使用 IndexedDB 存储对象,或为 其他 API 复制对象。
它通过递归遍历输入对象来克隆,同时维护一个先前访问过的引用的映射,以避免无限遍历循环。
结构化克隆不支持的功能
支持的类型
JavaScript 类型
- Array
- ArrayBuffer
- Boolean
- DataView
- Date
- Error类型(但请参阅下面的 错误类型)。
- Map
- Number
- Object对象:但仅限于普通对象(例如,来自对象字面量)。
- 原始类型,除了 symbol。
- RegExp:但请注意- lastIndex不被保留。
- Set
- String
- TypedArray
错误类型
对于 Error 类型,错误名称必须是以下之一:Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError(否则将设置为 "Error")。
浏览器必须序列化 name 和 message 属性,并期望序列化错误的其他“有趣”属性,如 stack、cause 等。
AggregateError 的支持预计将在 whatwg/html#5749 中添加到规范中(并且在某些浏览器中已得到支持)。
Web/API 类型
- AudioData
- Blob
- CropTarget
- CryptoKey
- DOMException:浏览器必须序列化- name和- message属性。其他属性也可能被序列化/克隆。
- DOMMatrix
- DOMMatrixReadOnly
- DOMPoint
- DOMPointReadOnly
- DOMQuad
- DOMRect
- DOMRectReadOnly
- EncodedAudioChunk
- EncodedVideoChunk
- FencedFrameConfig
- File
- FileList
- FileSystemDirectoryHandle
- FileSystemFileHandle
- FileSystemHandle
- GPUCompilationInfo
- GPUCompilationMessage
- GPUPipelineError
- ImageBitmap
- ImageData
- RTCCertificate
- RTCEncodedAudioFrame
- RTCEncodedVideoFrame
- VideoFrame
- WebTransportError
注意: 可序列化的对象在 Web IDL 文件中用 [Serializable] 属性进行标记。