克隆
结构化克隆
全局的 structuredClone() 方法使用结构化克隆算法将给定的值进行深拷贝。
该方法还支持把原始值中的可转移对象转移到新对象,而不是把属性引用拷贝过去。 可转移对象与原始对象分离并附加到新对象;它们不可以在原始对象中访问被访问到。
语法
js
/**
* @param {*} value 被克隆的对象。可以是任何结构化克隆支持的类型。
* @param {*[]} transfer 是一个可转移对象的数组,里面的 值 并没有被克隆,而是被转移到被拷贝对象上。
* @returns {*} 返回值是原始值的深拷贝。
*/
structuredClone(value);
structuredClone(value, { transfer });
/**
* @param {*} value 被克隆的对象。可以是任何结构化克隆支持的类型。
* @param {*[]} transfer 是一个可转移对象的数组,里面的 值 并没有被克隆,而是被转移到被拷贝对象上。
* @returns {*} 返回值是原始值的深拷贝。
*/
structuredClone(value);
structuredClone(value, { transfer });
结构化克隆不支持哪些?
Function
对象是不能被结构化克隆算法复制的;如果你尝试这样子去做,这会导致抛出 DATA_CLONE_ERR 的异常。- 企图去克隆
DOM
节点同样会抛出 DATA_CLONE_ERR 异常。 - 对象的某些特定参数也不会被保留
RegExp
对象的lastIndex
字段不会被保留属性描述符
、setters
以及getters
(以及其他类似元数据的功能)同样不会被复制。例如,如果一个对象用属性描述符标记为 read-only,它将会被复制为 read-write,因为这是默认的情况下。原形链上的属性
也不会被追踪以及复制。
结构化克隆能支持哪些?
- Array
- ArrayBuffer
- Boolean
- DataView
- Date
- Error 类型(仅限部分 Error 类型)。
- Map
- Object 对象:仅限简单对象(如使用对象字面量创建的)。
- 除 symbol 以外的基本类型。
- RegExp:lastIndex 字段不会被保留。
- Set
- String
- TypedArray