深克隆和浅克隆
什么是深克隆和浅克隆
克隆,就是将变量的值复制到新的变量中
浅克隆
对于基本数据类型而言,不存在深克隆和浅克隆的说法,否是将值进行复制,然后赋值到新的变量当中
而对于引用数据类型来说,浅克隆进行复制是将原本存在栈中变量保存的地址,复制给新的变量,此时两个变量指向的是相同的堆内存,当改变原来的对象时,实质上是改变的堆内存中的内容,由于两个对象指向的是同一个内存,所以新对象的内容也会改变
var arr1 = [1, 2, 3];
var arr2 = arr1;
arr2[0] = 99;
console.log(arr1);//[99, 2, 3]
深克隆
而对于引用数据类型来说,深克隆进行复制是在内存中开辟一个新的空间,这个空间保存的内容与原来的内容完全相同但是两个内存相互独立
如何实现深克隆
- JSON
var arr1 = [1, 2, 3];
var arr2 = arr1;
arr2[0] = 99;
console.log(arr1);//[99, 2, 3]
var arr3 = JSON.parse(JSON.stringify(arr1));
arr3[0] = 199;
console.log(arr1);
var arr4 = {name:'张三'};
var arr5 = arr4;
arr4.name = '李四';
console.log(arr5);//{name:'李四'}
var arr6 = JSON.parse(JSON.stringify(arr4));
arr4.name = '李四'
console.log(arr1);//{name:'张三'}
- 使用遍历复制
var arr1 = [1, 2, 3];
var arr2 = [];
for(var i in arr1){
arr2.push(arr1[i]);
}
console.log(arr2);
var arr1 = {name: '张三', age: 18};
var arr2 = {};
for (var i in arr1) {
arr2[i] = arr1[i];
}
console.log(arr2);