深拷贝(什么是深拷贝,为什么要进行深拷贝,如何进行深拷贝(至少写三种方法,手写深拷贝))
所谓拷贝,就是赋值。把一个变量赋给另外一个变量,就是把变量的内容进行拷贝。把一个对象的值赋给另外一个对象,就是把一个对象拷贝一份。
分为基本数据类型拷贝和引用数据类型拷贝
基本数据类型:
let a= 5
let b=a
b=4
console.log(a) // 5
console.log(b) // 4
我们会发现a的值是5 b的值是4 也就是a没有随着b改变而改变
引用数据类型(一般是数组,对象)
var arr1 = [1,3,5,6]
var arr2 = arr1
arr2[0] = 9
console.log(arr1) // [9,3,5,6]
console.log(arr2) //[9,3,5,6]
解决:
方法一(json)
var arr1 = [1,3,5,6]
var arr2string = JSON.stringify(arr1)
arr2 = JSON.parse(arr1string)
arr2[0] = 9
console.log(arr1) // [1,3,5,6]
console.log(arr2) //[9,3,5,6]
方法二(递归)
function aaclone(obj){
if(typeof obj !== 'object' || obj == null){
return obj
}
let newarr
if (obj instanceof Array) {
newarr= []
} else {
newarr = {}
}
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newarr[key] = aaclone(obj[key])
}}
return newarr
}
// var arr1 = [1,3,5,6]
// var arr2= []
// arr1.forEach((a)=>{
// arr2.push(copyObj(a))
// })
// arr2[0] = 9
// console.log(arr1) // [1,3,5,6]
// console.log(arr2) //[9,3,5,6]