结构化克隆算法
结构化克隆算法用于复制复杂 JavaScript 对象的算法。通过来自 Worker 的 postMessage()
或使用 IndexedDB 存储对象时在内部使用。它通过递归输入对象来构建克隆,同时保持先前访问过的引用的映射,以避免无限遍历循环。
结构化克隆所不能做到的
-
Function
对象是不能被结构化克隆算法复制的;如果你尝试这样子去做,这会导致抛出DATA_CLONE_ERR
的异常。 -
企图去克隆 DOM 节点同样会抛出
DATA_CLONE_ERR
异常。 -
对象的某些特定参数也不会被保留
RegExp
对象的lastIndex
字段不会被保留- 属性描述符,setters 以及 getters(以及其他类似元数据的功能)同样不会被复制。例如,如果一个对象用属性描述符标记为 read-only,它将会被复制为 read-write,因为这是默认的情况下。
- 原形链上的属性也不会被追踪以及复制。
支持的类型
JavaScript 类型
Array
ArrayBuffer
Boolean
DataView
Date
Error
类型(仅限部分 Error 类型)。Map
Object
对象:仅限简单对象(如使用对象字面量创建的)。- 除
symbol
以外的基本类型。 RegExp
:lastIndex
字段不会被保留。Set
String
TypedArray
Error 类型
仅支持以下 Error
类型:Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError(或其他会被设置为 Error
的)。
浏览器必须序列化 name
和 message
字段,其他有意义的字段则可能会序列化,如 stack
、cause
等。
AggregateError 预计会在 whatwg/html#5749 被添加到标准中(并且已被部分浏览器所支持)。