深浅拷贝

简单的概念:

  • 浅拷贝:将原对象/数组的引用赋值给新对象,新对象/数组只是一个引用
    • 改变新对象的时候,同时改变原对象
  • 深拷贝:创建一个新的对象/数组,将原对象/数组的各项属性的值拷贝过来
    • 改变新对象的时候,不改变原对象

只对第一层做拷贝:浅拷贝

对数组(基本类型数组)

  • 直接遍历

      let arr = [1,2,3,4]
      let newArray=[]
      遍历{
          newArray.push(item)
          }
    
  • slice() let newArray = arr.slice()

  • concat() let newArray = arr.concat()

对对象

  • 直接遍历
  • Object.assign()

      var obj = {name: 'ted', age:23}
      var copyObj = Object.assign({}, obj)
    
  • 扩展运算符…(数组同样适用) let copyObj = {...obj}

深拷贝:拷贝所有层级

  • JSON.parse(JSON.stringify(XXXX))

      let arr = [
          {number1: 1},
          {number2: 2},
          {number3: 3}
      ]
      let copyArr = JSON.parse(JSON.stringify(arr))
    
  • 递归

      function myCopy(obj) {
          let copyObj = obj.constructor === Array ? [] : {}
          for (let i in obj) {
              if (typeof obj[i] === 'object') {
                  copyObj[i] = myCopy(obj[i])
              } else {
                  copyObj[i] = obj[i]
              }
          }
      }