深拷贝和浅拷贝
当我们想拷贝一个已有的数组或者对象时,我们首先想到的是这样:
浅拷贝
<script>
var obj = {
name: 1,
height: 1
}
var newObj = obj;
setTimeout(() => {
newObj.name = 2;
newObj.height = 2;
console.log(obj);//{name: 2, height: 2}
console.log(newObj);//{name: 2, height: 2}
}, 1000)
</script>
但是这样直接进行拷贝的话,当我们改变newObj的时候,obj也回改变,这肯定不对啊,这就不是我们I型那个要的结果,这时我们就要进行深拷贝。
深拷贝
深拷贝一般分为两种,一种是数组的深拷贝,一种是对象的深拷贝,他们各有自己的写法
(1)数组的深拷贝
function deepClone(obj) {
var result = Array.isArray(obj) ? [] : {}; // 判断当前传进来的是对象还是数组
for (var key in obj) {
if (obj.hasOwnProperty(key)) { // 该key是否存在
if (typeof obj[key] === 'object' && obj[key] !== null) { // obj[key]如果为object,递归调用该方法,obj[key] = arr || obj[key] = {}都为'object'
result[key] = deepClone(obj[key]);
} else {
result[key] = obj[key];
}
}
}
return result;
}
let arr1 = [1, 2, 3, 4, 5];
let arr2 = deepClone(arr1);
arr2[0] = 'hello';
arr2[4] = 'world';
console.log(arr1); // [ 1, 2, 3, 4, 5 ]
console.log(arr2); // [ 'hello', 2, 3, 4, 'world' ]
(2)对对象进行深拷贝
<script>
var obj = {
name: 1,
height: 1
}
let newObj = JSON.parse(JSON.stringify(obj));
newObj.name = 2;
newObj.height = 2;
console.log(obj);//{name: 1, height: 1}
console.log(obj, newObj);//{name: 2, height: 2}
</script>