浅复制:只赋值一层对象,并不递归赋值对象内嵌套的对象
深复制:递归赋值对象中的所有值和对象
1.数组的浅复制 – slice
var arr_1 = [1,2,3];
var arr_2 = arr_1.slice(0);//slice方法取出数组的每一项传入一个新数组
arr_2.push(4);
console.log(arr_1);//[1,2,3]
console.log(arr_2);//[1,2,3,4]
2.数组的浅复制 –concat
var arr_1 = [1,2,3];
var arr_2 = arr_1.concat();//concat方法取出数组的每一项传入一个新数组
arr_2.push(4);
console.log(arr_1);//[1,2,3]
console.log(arr_2);//[1,2,3,4]
3.数组的深复制 –JSON.stringify (同样适用于对象)
//这个方法不能复制数组中带有非json数据格式,不允许的数据类型例如Function
var arr_1 = [1,2,{a:3}];
var arr_2 = JSON.parse(JSON.stringify(arr_1));//数组转为JSON字符串再转为数组
arr_2[2].a = 4;
console.log(arr_1);//[1,2,{a:3}]
console.log(arr_2);//[1,2,{a:4}]
4.对象的的浅复制 –for in (同样适用于数组)
var obj_1 = {a:1,b:2}
function copy(obj){
var newObj = {};
for(var key in obj){
newObj[key] = obj[key]
}
return newObj
}
var obj_2 = copy(obj_1);
obj_2.b = 3;
console.log(obj_1)//{a:1,b:2}
console.log(obj_2)//{a:1,b:3}
5.对象、数组的深拷贝
var obj_1 = {
school:'哈弗',
grade:{
level_1:[1,2,3]
}
}
function copy(obj){
if(Object.prototype.toString.call(obj) === '[object Array]'){
var newObj = [];
}else{
var newObj = {};
}
for(var key in obj){
newObj[key] = (typeof obj[key] ==='object' ? copy(obj[key]) : obj[key]);
}
return newObj
}
var obj_2 = copy(obj_1);
obj_2.school = '清华';
obj_2.grade.level_1.push(4);
console.log(obj_1.school)//哈弗
console.log(obj_2.school)//清华
console.log(obj_1.grade.level_1)//[1,2,3]
console.log(obj_2.grade.level_1)//[1,2,3,4]