浅拷贝和深拷贝的理解和实现

一、为何会有浅拷贝和深拷贝

首先要知道JS中数据结构分为值类型和引用类型。
值类型直接指向一块内存,内存中村放的是变量的值。
引用类型也会指向一块内存,内存中存放的是变量值的地址,而不是真的值自己。
那么引用类型中,值的变化会致使全部指向这块内存地址的变量得到的返回值都发生改变。在实际开发中,有时候咱们并不但愿如此,因此就出现了拷贝。
那么拷贝的含义就是把引用类型的值,从新开一个新的内存,放进去,这样在更改原来的值时,现有的值不会更改,引用类地址的变量也就不会更改了。

二、浅拷贝

浅拷贝只会获取对象的第一层属性或方法,若是属性依旧是一个对象,那么浅拷贝不会对属性里的对象的值再次开一个内存作存储,而是依旧沿用原来的地址。在简单的对象中使用浅拷贝便可。

三、浅拷贝的实现

大部分原声的函数返回一个新的对象都是浅拷贝。
例如:
一、Object.assign();
二、Array.concat();

四、深拷贝

深拷贝是对对象中每一层的对象进行拷贝。浅拷贝中,不是完整的拷贝。若是属性的对象的值发生变化依然可以影响拷贝后的对象,因此就须要深拷贝。

五、深拷贝的实现

若是是简单的对象,没有方法,那么最简单的方式是经过JSON进行转换,能知足大部分需求。须要注意的是,浏览器是否支持JSON
代码:
var newObject = JSON.parse(JSON.stringify(oldObject));
自定义函数:
function deepCopy(o) {
   var out, v, key;
   out = Array.isArray(o) ? [] : {};
   for (key in o) {
       v = o[key];
       out[key] = (typeof v === "object") ? deepCopy(v) : v;
   }
   return out;
}

参考

stackoverflow地址:
http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-deep-clone-an-object-in-javascript/122704#
相关文章
相关标签/搜索