其实深浅拷贝也就是深浅复制,个人理解就是基于在存储位置的基础上。
1.浅拷贝
简而言之就是简单的去复制数组和对象的地址,只是复制的地址,其实它们所指向的还是同一个存储空间,如果存储空间里的内容发生了改变,它们彼此之间都会有影响。
举个简单的例子:
let arr1 = [1,2,3,4,5]; //这就是浅拷贝
let arr2 = arr1; //只是简单的复制了存储在栈里的指针,arr2和arr1中存储的是相同的 数组的内存地址
//如果此时通过arr2修改数组的内存地址里的内容
arr2[0]='我变了';
console.log(arr1); //这时arr1指向的内容也是被修改后的内容
2.深拷贝
就是完完整整的复制其他数组和对象所指向的内存地址里的内容,这样就是两个完全独立的、互不影响的两个变量对应着各自的存储空间
例如:
let arr1 = [1,2,3,4,5];
let arr2 = [];
//遍历arr1所对应的存储空间的内容
arr1.forEach(function(item){
//将arr1中存储空间里的内容复制添加到arr2中
arr2.push(item);
});
arr2[0] = '我变了'; //不会影响arr1中的内容
console.log(arr1); //[1,2,3,4,5];
console.log(arr2); //['我变了',2,3,4,5];
注:如果是复杂的像是多维数组等,就不能是简单的拷贝数组的地址,原生js中而是要用递归的方式来解决。
其实在jQuery中有专门的方法来实现:
//$.extend() :将对象2,对象3...之后的数据类型复制到对象1中。
浅拷贝:$.extend()( 是否深拷贝(不写) , 对象1,对象2,对象3...)
深拷贝: $.extend()( 是否深拷贝(true) , 对象1,对象2,对象3...)