Skip to content

浅拷贝

object.assign

  • 浅拷贝

  • 不会拷贝对象的继承属性

  • 不会拷贝对象的不可枚举属性

  • 可以拷贝Symbol属性

扩展运算符

  • 浅拷贝

concat拷贝数组

  • 浅拷贝
  • 只能拷贝数组

slice拷贝数组

  • 浅拷贝
  • 只能拷贝数组

手写一个浅拷贝

深拷贝

JSON.stringfy

  • 拷贝的对象的值中如果有函数、undefined、symbol 这几种类型,经过 JSON.stringify 序列化之后的字符串中这个键值对会消失;

  • 拷贝 Date 引用类型会变成字符串;

  • 无法拷贝不可枚举的属性;

  • 无法拷贝对象的原型链;

  • 拷贝 RegExp 引用类型会变成空对象;

  • 对象中含有 NaN、Infinity 以及 -Infinity,JSON 序列化的结果会变成 null;

  • 无法拷贝对象的循环应用,即对象成环 (obj[key] = obj)。

深拷贝基础手写递归实现

  • 不能拷贝不可枚举属性和Symbol类型
  • 只针对普通引用类型做递归复制 (数组,正则,日期等 不能正确拷贝)
  • 无法拷贝对象的循环应用,即对象成环 (obj[key] = obj)

深拷贝升级手写递归实现

利用Object的getOwnPropertyDescriptors方法可以获得对象的所有属性,以及对应的特性,顺便结合Object的create方法创建一个新对象,并继承传入对象的原型链 。利用WeakMap类型作为Hash表,因为WeakMap是弱引用类型,可以有效防止内存泄漏,作为检测循环引用很有帮助,如果存在循环,则引用直接返回WeakMap存储的值

其他手写深拷贝