xinchanghao / one-day-in-the-future

有朝一日,起飞...
2 stars 1 forks source link

深拷贝和浅拷贝 #7

Open xinchanghao opened 4 years ago

xinchanghao commented 4 years ago

浅拷贝之所以被称为浅拷贝,是因为对象只会被克隆最外部的一层,至于更深层的对象,则依然是通过引用指向同一块堆内存。浅拷贝可以使用 Object.assign 和展开运算符来实现。

// 浅克隆函数

function shallowClone(o) {
  const obj = {};
  for ( let i in o) {
    obj[i] = o[i];
  }
  return obj;
}

深拷贝相对浅拷贝而言,如果遇到属性值为引用类型的时候,它新建一个引用类型并将对应的值复制给它,因此对象获得的一个新的引用类型而不是一个原有类型的引用。

深拷贝对于一些对象可以使用 JSON 的两个函数来实现,但是由于 JSON 的对象格式比 js 的对象格式更加严格,所以如果属性值里边出现函数或者RegExp、Sympol等是特殊类型的值时,会转换失败。而且会抛弃对象的constructor,所有的构造函数会指向Object。参考