js深拷贝和浅拷贝

120 阅读1分钟

什么是浅拷贝,深拷贝

  • 浅拷贝拷贝的是地址,修改拷贝后的数据对原数据有影响
  • 深拷贝拷贝的是数据,修改拷贝后的数据对原数据没有影响
let obj = {
      name: '张三',
      aeg: '18',
      hobby: ['唱', '跳', 'rap', '篮球'],
    }
​
    // 浅拷贝拷贝的是地址
    let obj1 = obj
    obj1.hobby[0] = '吃饭'
    // 请问只有obj1变还是obj也变
    console.log(obj, obj1);
    // 结果:震撼我妈。两个都变

注意:值类型和引用类型的区别。

image.png

如何实现深拷贝

  • json方式(推荐)

    1. 先把对象转json格式 JSON.stringify(js对象)
    2. 再把json字符串转成js对象 JSON.parse(json字符串)
    let obj = {
          name: '张三',
          aeg: '18',
          hobby: ['唱', '跳', 'rap', '篮球'],
        }
    ​
     let jsonStr = JSON.stringify(obj)
        let obj1 = JSON.parse(jsonStr)
        obj1.hobby[0] = '干饭'
        console.log(obj1, obj);
    

image.png

  • 递归

    forin遍历

    let obj = {
          name: '张三',
          aeg: '18',
          hobby: ['唱', '跳', 'rap', '篮球'],
        }
    
        // newObj:拷贝后的新对象    obj:要拷贝的对象
        function copy(newObj, obj) {
          // 遍历obj对象的所有属性,赋值给newObj
          for (let key in obj) {
            // 如果是值类型,则直接拷贝数据.如果是引用类型,继续遍历
            if (obj[key] instanceof Array) {
              // 数组类型
              newObj[key] = []
              copy(newObj[key], obj[key])
    
            } else if (obj[key] instanceof Object) {
              // 对象类型
              newObj[key] = {}
              copy(newObj[key], obj[key])
    
            } else {
              // 值类型
              newObj[key] = obj[key]
            }
          };
        }
    
        let obj1 = {}
        copy(obj1, obj)
        obj1.hobby[0] = '干饭'
    
        console.log(obj1, obj);
    

image.png