首先深复制和浅复制只针对像 Object, Array 这样的复杂对象的。简单来说,浅复制只复制一层对象的属性,而深复制则递归复制了所有层级。
一、浅拷贝
在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,改变newArr,arr也会变化
const arr = [1, 2, 3];
const newArr = arr; // 直接复制
newArr.reverse(); // [3,2,1]
arr // [3,2,1]
二、深拷贝
深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误。
const arr = [1, 2, 3];
// 通过JSON.parse,JSON.stringify进行深拷贝
const newArr = JSON.parse(JSON.stringify(arr));
newArr.reverse(); // [3,2,1]
arr // [1,2,3]
三、举例
例1:仅仅复制对象的值
var o = {a: 1};
Object.keys(o) // ['a']
o.hasOwnProperty('a') // true
var d = {a:o.a}
d // {a: 1}
d.a = 4;
d // {a: 4}
a // {a: 1}
例2:通过深拷贝创建一个属性值一样内存不一样的对象
var e = JSON.parse(JSON.stringify(o))
e // {a: 1}
e.a = 3;
e // {a: 3}
o // {a: 1}