深拷贝拷贝的是对象或者数组内部数据的实体,重新开辟了内存空间存储数据;
浅拷贝拷贝的是引用类型的指针,副本和原数组或对象指向同一个内存;
简单说数据的赋值,简单的数据直接赋值是没有问题的
问题:
var arr1 = new Array(12,23,34) Var arr2 = arr1;
//这就是一个最简单的浅拷贝
//写函数
function copyObj(obj){
let newObj={};
for(let key in obj){
if(typeof obj[key] =='object'){//如:key是wife,引用类型,那就递归
newObj[key] = copyObj(obj[key])
}else{//基本类型,直接赋值
newObj[key] = obj[key];
}
}
return newObj;
}
数组
1.concat方法
var arr1 = [1, 2, 3, 4] var arr2 = arr1.concat()
//复制当前数组并返回实现深拷贝的副本,arr1独立而不受影响 console.log(arr2);[1, 2, 3, 4] var arr3 = arr1.concat([5, 6, 7])
//将数组中的每一项都添加到深拷贝的副本数组中 console.log(arr3);
//[1, 2, 3, 4, 5, 6, 7] 2.slice方法 var arr = [1, 2, 3, 4] var arr1 = arr.slice(1)
//接收1到2个参数,一个参数时,返回参数指定调用方法数组位置到末尾的值组成的深拷贝副本 console.log(arr1);
//[2, 3, 4] var arr2 = arr.slice(0, 1) console.log(arr2);
//[1] 3.扩展运算符 const arr = [1, 2, 3] const arr1 = [...arr] arr1.push(4) console.log(arr1);
//[1, 2, 3, 4] console.log(arr);
//[1, 2, 3] 注意,对于数组项是引用类型的数据,就无法实现深拷贝了 对象 对象 1.Object.assign(目标对象, 源对象),源对象的所有可枚举属性都复制到目标对象上
var obj = { a: 1, b: 2 }
var obj1 = {}
Object.assign(obj1, obj) console.log(obj1);
//{a: 1, b: 2} obj1.c = 3 console.log(obj1);
//{a: 1, b: 2, c: 3} console.log(obj);
//{a: 1, b: 2},obj没有被改变,实现了深拷贝
2.JSON var obj = { a: 1, b: 2 }
// 将javascript值转为JSON字符串 var jsonText = JSON.stringify(obj) console.log(jsonText);
//{"a":1,"b":2}
// 把JSON字符串转为javascript值 var obj1 = JSON.parse(jsonText) console.log(obj1);
//{a: 1, b: 2}
// 修改obj1,看原对象值是否被改变 obj1.c = 3 console.log(obj1);
//{a: 1, b: 2, c: 3} console.log(obj);
//{a: 1, b: 2},没被改变,实现了深拷贝
3.扩展运算符 var obj = { a: 1, b: 2 } var obj1 = {...obj} console.log(obj);
//{a: 1, b: 2} console.log(obj1);
//{a: 1, b: 2} obj.a = 33 console.log(obj);
//{a: 33, b: 2} console.log(obj1);
//{a: 1, b: 2}没改变,实现了深拷贝