JavaScript深克隆
为什么需要深克隆
对于引用类型值(数组,对象,函数,正则表达式),在进行var a = b;传值时,内存中不产生新的副本,而是新变量也指向内存中同一个地址。
因此,在进行==判断时,比较的是两的内存是否相同。
同时,Boolean([ ] == [ ])的值为false。
要想深克隆的话,就要使用递归,来解决数组中的某项是数组的问题。否则的话,可能就会克隆不完全,新数组中还有一部分和原数组的指向内存地址一样。
<script>
//JS仅判断数组和基本类型值的深克隆
//arr1为原数组
var arr1=[12,11,34,[11,['士大夫'],22],65];
//函数的作用为深克隆
function deepClone(arr){
//存放结果的数组
var result=[];
for(var i=0; i<arr.length; i++){
//判断是否为数组,其实也可能是对象,这里先不考虑
if(Array.isArray(arr[i])){
//该项是数组的话,使用递归
//递归后获得的该项也要放到result结果数组中去
result.push(deepClone(arr[i]));
}else{
result.push(arr[i]);
}
}
//将结果数组返回
return result;
}
//将函数返回的结果传给result变量
var result = deepClone(arr1);
console.log(result);
//检查数组中的数组是否一致,预期结果false
console.log(arr1[3]==result[3]);
//在原数组的'士大夫'后面加上88这项
arr1[3][1].push(88);
//结果显示两个数组不一样result没有88这一项
//如果是var arr2 = arr1;这样传值的话,arr1和arr2中都将会有88这一项
console.log(arr1);
console.log(result);
</script>