Skip to content

克隆

结构化克隆

全局的 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

手写克隆

༼ つ/̵͇̿̿/’̿’̿ ̿ ̿̿ ̿̿◕ _◕ ༽つ/̵͇̿̿/’̿’̿ ̿ ̿̿ ̿̿ ̿̿