思路
当我们需要深拷贝一个数组,并且这个数组里面包含数值类型、对象类型,或者数组嵌套数组的时候,先写两个函数,一个是深拷贝数组的方法,一个是深拷贝对象的方法,然后把这两个函数结合到一个函数里。
数组深拷贝
var arr=[1,2,3,4,5,6];
function fun1(arr){
var arr1=[];
for(var i=0;i<arr.length;i++){
arr1.push(arr[i]);
}
return arr1;
}
var res = fun1(arr);
arr.push[0,9,8];
console.log(res);
对象深拷贝
var obj={name:"张三",age:43}
function fun2(obj){
var obj1={};
for(x in obj){
obj1[x]=obj[x];
}
return obj1;
}
var res = fun2(obj);
obj.name="李四";
console.log(res);
结合到一个函数里
function fun(arr){
if(arr.constructor.name==="Array"){
var arr1=[];
for(var i=0;i<arr.length;i++){
arr1.push(arr[i]);
}
return arr1;
}else{
var obj={}:
for(x in arr){
obj[x]=arr[x];
}
return obj;
}
}
上面的这个结合,只是单纯的判断了一下 这个形参是数组还是对象,但是,如果这个形参是个对象数组怎么办,那么就需要再次进行判断了。
function fun(arr){
if(arr.constructor.name==="Array"){
var arr1=[];
for(var i=0;i<arr.length;i++){
if (typeof(arr[i])==="object"){
arr1.push(fun1(arr[i]));
}else{
arr1.push(arr[i]);
}
}
return arr1;
}else{
var obj={}:
for(x in arr){
if(typeof(arr[i]==="object")){
obj[x]=fun1(arr[x]);
}else{
obj[x]=arr[x];
}
}
return obj;
}
}
var a =[1,2,3,{name:"zhangsan", age:23},[7,8,9]];
var str= fun1(a);
a[3].name="lisi";
console.log(res);
网友评论