zoukankan      html  css  js  c++  java
  • ES6 对象解构赋值(为深拷贝还是浅拷贝)

    对象的扩展运算符(...)用于取出参数对象的所有可遍历属性,拷贝到当前对象之中。

    拷贝对象

    let aa = {
        age: 18,
        name: 'aaa'
    }
    
     
    let bb = {...aa};
    console.log(bb);  // {age: 18, name: "aaa"}

    合并对象

    扩展运算符(...)可以用于合并两个对象

    let aa = {
        age: 18,
        name: 'aaa'
    } 
    
    let bb = {
        sex: '男'
    }
      
    let cc = {...aa, ...bb}; 
    
    
    // 等同于: 
    // let cc = Object.assign({}, aa, bb);
    
    
    console.log(cc); // {age: 18, name: "aaa", sex: "男"}

    拷贝并修改对象

    在扩展运算符后面,加上自定义的属性,则扩展运算符内部的同名属性会被覆盖掉。

    let aa = {
        age: 18,
        name: 'aaa'
    }
     
    let dd = {...aa, name: 'ddd'};
     
    
    // 等同于: 
    // let dd = {...aa, ...{name: 'ddd'}};
    // let dd = Object.assign({}, aa, { name: 'ddd'});
    
    
    
    console.log(dd); // {age: 18, name: "ddd"}

    一般,在 redux 中修改 state 时,会用解构赋值的方法。

    但是,解构后得到的新对象,相对于老对象,是浅拷贝,还是深拷贝?

    例如,下面肯定是引用赋值:

    let aa = {
        age: 18,
        name: 'aaa'
    }
    
    let bb = aa;
    bb.age = 22;
    
    console.log(aa.age); // 22

    上面, 对象 bb 是 aa 的一个引用赋值。那么,如果使用解构赋值得到 bb 呢:

    let aa = {
        age: 18,
        name: 'aaa'
    }
    
    let bb = {...aa};
    bb.age = 22;
    
    console.log(aa.age); // 18
    • 可见,改变 bb 的属性 age 的值,并不会改变对象 aa 的属性的 age 的值,所以,上面的例子bb是aa的一份拷贝
    • 但是,这个拷贝是只有一层的浅拷贝,还是深拷贝?
      let aa = {
          age: 18,
          name: 'aaa',
          address: {
              city: 'shanghai'
          }
      }
      
      let bb = {...aa};
      bb.address.city = 'shenzhen';
      
      console.log(aa.address.city);  // shenzhen

      可见,aa 解构赋值到新对象 bb,只是进行了一层浅拷贝,对象 bb 中的属性(address)的属性(city)还是对象 aa 中属性的属性的引用。

      如果像拷贝 aa 中的 city 属性,可以像下面处理:

      let aa = {
          age: 18,
          name: 'aaa',
          address: {
              city: 'shanghai'
          }
      }
      
      let bb = {
          ...aa,
          address: {...aa.address}
      };
      
      bb.address.city = 'shenzhen';
      
      console.log(aa.address.city);  // shanghai
  • 相关阅读:
    Unity 高斯模糊
    Unity 描边效果
    Unity 单例模式
    C++ 高质量程序设计指南读书笔记
    visualgo 各种算法的具体实现——排序篇
    UE4 Texture操作总结
    UE4 使用WASAPI获取系统音频
    C++ 前置声明
    跟着pyAudioAnalysis学语音
    排序算法(高级篇,整理自学堂在线邓俊辉老师《数据结构》课程)
  • 原文地址:https://www.cnblogs.com/zhangyezi/p/13755119.html
Copyright © 2011-2022 走看看