浅拷贝与深拷贝
// 浅拷贝,没有改变内存中数据的地址 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) 注:递归方式遍历数据下全部数据类型,基本类型直接赋值,复杂类型新建内存地址,把复杂数据遍历放入新地址