浅拷贝与深拷贝

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

  

posted @ 2023-03-07 11:23  风在吹,雪纷飞  阅读(14)  评论(0编辑  收藏  举报