浅复制和深复制的区别
我们在对数据类型进行复制时,对于基础数据类型,是不分深复制和浅复制的,都是拷贝了他们的数据,而对数组和对象进行复制时,我们通常复制的,都是该对象的内存地址,而不是它的具体数据,当内存地址的数据改动时,复制到的东西也会变化,如下图
深复制的方法
-
JSON.parse(JSON.stringify())
原理:JSON.stringify把对象转化成字符串,JSON.parse再把字符串转化成对象,这样新的对象就会重新开辟一个栈存放数据,从而实现了深复制。 -
利用递归
var arr = [1, 2, 3] var arr2 = clone(arr) arr2.push(4) console.log(arr, arr2) function chanceType(obj) { //检测数据类型的函数 return Object.prototype.toString.call(obj).slice(8, -1) } //深复制的函数 function clone(obj) { let newObj, objType = chanceType(obj) //新建一个复制后的对象,并把obj的数据类型存下来 if (objType === "Object") { newObj = {} } else if (objType === "Array") { newObj = [] } for (let i in obj) { let value = obj[i] if (chanceType(value) === "Object" || chanceType(value) === "Array") { //如果遍历到的数据类型依然有数组或对象,那么再次调用深复制函数进行递归 newObj[i] = clone(value) } else { newObj[i] = value } } return newObj }
原理:因为即便是对象和数组,他的深层数据也都是基础数据类型,所以我们可以利用递归来一层层的遍历,直到把所有基础数据类型全部复制完成,就完成了深复制。