深拷贝和浅拷贝

(1)浅拷贝新旧对象共享同一块内存

let a = {
 age: 1
}
let b = a
a.age = 2
console.log(b.age) // 2====》如果给一个变量赋值一个对象,那么两者的值会是同 一个引用,其中一方改变,另一方也会相应改变
  • 创建新对象

    • 基本类型:拷贝基本类型的值

    • 引用类型:拷贝指针(内存地址),不拷贝对象本身,其中一个对象改变地址,影响另一个对象

  • 方法:

    • for-in遍历对象

    • 展开运算符 ...

      • let a = {age: 1}
        let b = {...a}
        a.age = 2
        console.log(b.age) // 1
    • Object.assign()

      • let a = {age: 1}
        let b = Object.assign({}, a)
        a.age = 2
        console.log(b.age) // 1
    • 使用lodash提供的函数 _.clone()

(2)深拷贝新对象与原对象不共享内存

  • 完整拷贝对象,堆内存中开辟新区域,修改新对象不会影响原对象

  • 方法:

    【npm install loadsh】

    • 使用lodash提供的函数 _.cloneDeep()

          

     

    • 使用递归函数完成

    • function deepClone(oldObj) {
      // 判断当前要拷贝的是数组还是对象,新建空对象或者空数组
      var newObj = Array.isArray(oldObj) ? [] : {}
      // 只能使用for-in,既可以遍历数组,也可以遍历对象
      for (var k in oldObj) {
      // console.log(k, oldObj[k])
      // 要被每一项放入到创建的新对象(数组)
      // 如果是原始类型的值,直接放入到新对象(数组),否则是引用类型的值,进行递归拷贝
      if (typeof oldObj[k] === 'object') {
      newObj[k] = deepClone(oldObj[k])
      } else {
      newObj[k] = oldObj[k]
      }
      }
      // 最后返回新对象(数组)
      return newObj
      }
    • 使用JSON对象,先转字符串再转对象,JSON.parse(JSON.stringify())

              

posted @ 2023-06-20 15:12  有只小菜猫  阅读(15)  评论(0)    收藏  举报