拷贝数据:
基本数据类型:拷贝后会生成一份新的数据,修改拷贝后的数据不会影响原来的数据
数组/对象:拷贝后会不会生成新数据,而是拷贝引用,修改拷贝后的数据会影响原来的数据
拷贝数据的方法:
1.赋值给变量 //浅拷贝
2.Array.propotype.concat() //浅拷贝
3.Array.proppotype.slice() //浅拷贝
4.Object.assign() //浅拷贝 es6提供的浅拷贝方法
5.JSON.parse(JSON.stringify()) //深拷贝(深度克隆)
浅拷贝(对象、数组)
特点:拷贝的是引用,修改拷贝以后的数据会影响原来的数据
深拷贝(深度克隆)
特点:拷贝生成新数据,修改拷贝以后的数据不会影响原来的数据
深拷贝实现:
拷贝的数据里不能有对象、数组,如果有就可以继续遍历对象、数组拿到里面的每一项值,一直到拿到的是基本数据类型,然后再去赋值,就是深度拷贝
//判断数据的类型
function chechType(target){
return Object.propotype.toString.call(target).slice(8,-1)
}
function clone(target){
//声明两个变量,一个接收克隆的数据,一个接收被克隆数据的类型
//先定义接收克隆的数据的类型或简单类型就直接赋值
let result, targetType=checkType(target);
if(targetType === 'Object'){
result={};
}else if(targetType === 'Array'){
result=[]
}else{
// 简单类型数据直接返回,相当于已克隆完成
return target
}
// 遍历目标数据,还需判断目标数据里面的值的类型,
// 1.如果值的类型是对象或数组,就要重新判断值的类型,形成递归,则调用自己
// 2.如果值的类型是简单类型,就赋值给result的相对应的key或下标
for(let i in target){
let value=target[i];
result[i]=clone(value);
}
// 最后返回克隆好的数据
return result
}
let arr=[1,3,4,{name:'df',child:[{name:'dd'},{name:'rr'}]}]
let arr2=cloneTarget(arr)
console.log(arr2,arr);