1.为什么需要深拷贝
对于对象或数组一类的引用类型来说,如果将其直接赋值给一个变量,那么这个变量中存储的其实是对象或数组的引用,而此时如果有另一个变量也拥有这个引用并修改了其中的值那么会导致这个对象或数组直接改变,对别的也引用了的地方产生不好的影响。
2.深拷贝是什么
其实就是将这个数组或对象完全中的所有字段和值全部复制下来,这个时候就不是用原来的引用了,而是一个副本一个拷贝。
3.实现深拷贝的技术要点
- 要处理非引用类型的情况,因为使用了递归,在遍历到最后一层的时候肯定需要返回值类型
- 要将对象和数组的情况考虑到
- 使用递归的方式进行深层遍历
4.深拷贝代码
function deepClone(obj={}){
//处理非引用类型的情况
if(typeof obj !== 'object' || typeof obj == null){
return obj
}
let result;
// 对象和数组有不同的处理
if(obj instanceof Array){
result = []
}else{
result = {}
}
//递归遍历
for(let key in obj){
//需要防止这个属性是原型链上的属性
if(obj.hasOwnProperty(key)){
result[key] = deepClone(obj[key])
}
}
return result;
}