一、浅拷贝
首先,浅拷贝和深拷贝只针对引用类型
浅拷贝拷贝的是地址,深拷贝拷贝的是值
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
浅拷贝例子
let a = [0,1,2,3,4], b = a;
console.log(a === b);
a[0] = 1;
console.log(a, b);
a的值发生改变b也会改变
二、深拷贝
在使用深拷贝的时候,一定要弄清楚对深拷贝的要求程度,是仅深拷贝第一层级的对象属性或者数组元素,还是递归拷贝所有层级的对象属性和数组元素
深拷贝数组
- 直接遍历
var arr = [1, 2, 3, 4];
function copy(arr){
var newArr = [];
for(var i=0;i<arr.length;i++){
newArr.push(arr[i]);
}
return newArr;
}
var arrB = copy(arr);
console.log("arrB:", arrB);
console.log("-----------改变arrB中数组元素的值后-----------");
arrB[0] = 5;
console.log("arr:", arr);
console.log("arrB:", arrB);
concat()
:用于连接两个或多个数组。该方法不会改变现有数组,仅仅只会返回被连接数组的一个副本。
var arr = [0, 1, 2];
var arrB;
//把arr赋值给arrB
arrB = arr.concat();
console.log("arr:", arr);
console.log("arrB:", arrB);
console.log("-----------改变arrB中数组元素的值后-----------");
arrB[0] = 5;
console.log("arr:", arr);
console.log("arrB:", arrB);
slice()
:该方法返回一个从已有的数组中截取一部分元素片段组成新的数组(不改变原数组)。
var arr = [0, 1, 2, 4, 5];
var arrB;
//把arr赋值给arrB
arrB = arr.slice();
console.log("arr:", arr);
console.log("arrB:", arrB);
console.log("-----------改变arrB中数组元素的值后-----------");
arrB[0] = 10;
arr[4] = 8;
console.log("arr:", arr);
console.log("arrB:", arrB);