// 浅拷贝,没有改变内存中数据的地址
let arr = [1]
let a = arr
a.push(2)
console.log(arr, a) // [1, 2],[1, 2]
// 深拷贝一解构赋值,问题:只是用一维数组
let arr = [1]
let a = [...arr]
a.push(2)
console.log(arr, a) // [1], [1, 2]
arrM = [[1]]
let b = [...arrM]
b[0].push(2)
console.log(arrM, b) // [[1, 2]], [[1, 2]]
// 深拷贝二双JSON,问题:消耗性能,含关键字不适用
let arr = [1]
let a = JSON.parse(JSON.stringify(arr))
a.push(2)
console.log(arr, a) // [1], [1, 2]
let arrE = {a: 1, b: function(){}}
let b = JSON.parse(JSON.stringify(arrE))
console.log(b) // {a: 1}
// 深拷贝复杂类型数据
let obj = {a: 1, b: { c: 3, d: 4 }}
function deepClone(data) {
let target = null
if (typeof data === 'object' && data !== null) {
target = data instanceof Array ? [] : {}
for(let i in data) {
target[i] = deepClone(data[i])
}
} else {
target = data
}
return target
}
let d = deepClone(obj)
注:递归方式遍历数据下全部数据类型,基本类型直接赋值,复杂类型新建内存地址,把复杂数据遍历放入新地址