1. 深复制和浅复制概念
数据类型分为简单数据类型和复杂数据类型两种,
深复制复制的是真正的值 简单数据类型都是深复制
浅复制复制的是地址 复杂数据类型普通的复制都是浅复制
深拷贝是指,拷贝对象的具体内容,深拷贝在计算机中开辟一块新的内存地址用于存放复制的对象。源数据改变不会影响复制的数据
2.如何实现数组的深拷贝(3种方法)
数组是一个引用数据类型 普通的复制只能实现浅拷贝
(1)使用concat合并数组,会返回一个新的数组
对象是一个引用数据类型 普通的复制是一个浅拷贝
*对象的深拷贝方法
1.借用JSON对象的parse和stringify
(转换)let obj2 = JSON.parse(JSON.stringify(obj));
2.递归 自身调用自身
当去复制一个复杂的对象的时候,如果这个对象的key是一个简单类型,就直接复制,如果还是一个引用类型就调用自身再次进行循环复制
3.可以通过 for in 实现
function deepCopy1(obj) {
let o = {}
for(let key in obj) {
o[key] = obj[key]
}
return o
}
let obj = {
a:1,
b: undefined,
c:function() {},
}
console.log(deepCopy1(obj))
3.为什么要使用深拷贝?
我们希望在改变新的数组(对象)的时候,不改变原数组(对象)
arr=[100, [{a : 'hello'}, {b : "world"}], { c: "123456789" }];
//判断修改的是不是'object'或者null,如果不是 object 或者 null 那么直接返回
function deepClone(obj = {}) {
if (typeof obj !== 'object' || obj == null) {
return obj;
}
let result;
//判断上面下来的obj是不是数组 用instanceof来检测 因为是数组应用类型
obj instanceof Array?result=[]:result={}
for (var item in obj) {
//查找一个对象是否有某个属性
if (obj.hasOwnProperty(item)) {
// 递归调用
result[item] = deepClone(obj[item])
}
}
return result;
}
let arr1=deepClone(arr);
arr1[1][0].a='vue'
arr1[0]=99
console.log('原数组',arr)
console.log('新数组',arr1)