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

1、为什么会有浅拷贝和深拷贝

首先要知道JS中数据结构分为值类型和引用类型。
值类型直接指向一块内存,内存中村放的是变量的值。
引用类型也会指向一块内存,内存中存放的是变量值的地址,而不是真的值本身。
那么引用类型中,值的变化会导致所有指向这块内存地址的变量获得的返回值都发生改变。在实际开发中,有时候我们并不希望如此,所以就出现了拷贝。
那么拷贝的含义就是把引用类型的值,重新开一个新的内存,放进去,这样在更改原来的值时,现有的值不会更改,引用类地址的变量也就不会更改了。

2、浅拷贝

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

3、浅拷贝的实现

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

4、深拷贝

深拷贝是对对象中每一层的对象进行拷贝。浅拷贝中,不是完整的拷贝。如果属性的对象的值发生变化依然能够影响拷贝后的对象,所以就需要深拷贝。

5、深拷贝的实现

如果是简单的对象,没有方法,那么最简单的方式是通过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#
原文地址:https://www.cnblogs.com/liuyt/p/6634404.html