首页 > 其他分享 >ES6笔记 - 扩展运算符

ES6笔记 - 扩展运算符

时间:2022-12-06 21:33:53浏览次数:40  
标签:ES6 ... 对象 扩展 笔记 运算符 let var

扩展运算符

目录

1. 数组中的扩展运算符

  • 扩展运算符...可以将一个数组转换为用逗号分隔的参数序列,一定程度上取代了apply()

    只要是实现了Iterator接口的对象,都可以使用扩展运算符拆分

    console.log(...[1,2,3]);	//1,2,3
    console.log(0,...[1,2,3],4);	//0,1,2,3,4
    
    var numbers = [4,38];
    add(...numbers); //42
    
  • 扩展运算符可以与正常函数参数结合使用

    function(v,w,x,y,z){}
    var args = [0,1];
    f(-1,...args,2,...[3]);
    
  • 扩展运算符后面还可以放置表达式

    const arr = [...(x > 0 ? ['a'] : []),b];
    

1.1 应用场景

  • 合并数组

    var arr1 = ['a','b']
    var arr2 = ['c']
    
    var arr = [...arr1, ...arr2]
    
  • 字符串拆分

    [...'hello']
    //["h","e","l","l","o"]
    
  • 读取函数返回值

    //取出数组形式的数据
    var dateFields = readDateFields(database);
    //扩展运算符直接拆分数组传参
    var d = new Date(...dateFields);
    

2. 对象中的扩展运算符

  • 扩展运算符...也可以用于取出参数对象中的所有可遍历属性,并将其复制到当前对象之中

    let z = {a:3, b:4};
    let n = {...z}	//{a:3, b:4}
    

2.1 应用场景

  • 拆分对象

    //取出对象形式的数据
    var Person1 = getPerson1();
    //扩展运算符直接拆分对象传参
    var Person2 = new Person(...Person1);
    
  • 合并对象

    let ab = {...a, ...b}
    
    //如果用户自定义的属性放在扩展运算符后面,扩展运算符内部的同名属性会被覆盖
    let aWithOverrides = {...a, x:1, y:2};
    
    //如果把自定义属性放在扩展运算符前面,就变成了设置新对象的默认值
    let aWithDefaults = {x:1, y:2, ...a};
    

3. 解构赋值中【不一样的】扩展运算符

  • 之前介绍的扩展运算符主要履行的是"拆分"功能,如果仔细观察就会发现,它们都出现在等号的右边或是以实参的形式出现

  • 如果它们出现在等号左边(如解构赋值),那么它们就会执行完全相反的功能——合并剩余项

    //数组
    let [head, ...tail] = [1,2,3,4];	//tail=[2,3,4]
    
    //对象
    let {x,y,...z} = {x:1, y:2, a:3, b:4};	//z = {a:3, b:4}
    
    //形参,这种应用方式又被称为rest参数
    function push(array,...items){
        //items会以数组形式接收所有传入的多余参数
    }
    
  • 记住,在等号左边或形参中出现的...履行收集多余参数的职责;在等号右边或实参中出现的...履行拆分的职责

4. 浅拷贝问题

  • 无论履行哪种职责,扩展运算符始终都是浅拷贝,这意味着:

    • 在解构深层数组/对象的时候,只有第一层会被深拷贝,对于深层扩展运算符解构赋值复制的是这个值的引用而不是副本

      //解构深层对象
      let obj = {a:{b:1}};
      let {...x} = obj;
      obj.a.b = 2;	//尝试修改obj中b的值
      x.a.b;	//结果为2,x中的值也被修改了,说明是浅拷贝
      

      同时也不会复制继承自原型对象的属性

      let o1 = {a:1};
      let o2 = {b:2};
      o2.__proto__ = o1;
      
      let {...o3} = o2;
      o3;		//{b:2}
      o3.a;	//undefined
      
      //值得注意的是,如果直接赋值反而不会有这个问题
      let {o4} = o2;
      o4;		//{b:2}
      o4.a;	//{a:1}
      
    • 在拆分数组/对象的时候,也只有第一层会被深拷贝

      let a:{
          "a1":1,
          "b":{
              "c":2,
              "d":{
                  "d1":3
              }
          }
      }
      let cxy = {...a}
      
      //尝试修改cxy中的值
      cxy.a1 = 1;
      cxy.b.d.d1="cxy"
      
      a.a1;	//1,第一层做了深拷贝
      a..b.d.d1;	//cxy,深层只做了浅拷贝
      

标签:ES6,...,对象,扩展,笔记,运算符,let,var
From: https://www.cnblogs.com/Solitary-Rhyme/p/16960623.html

相关文章

  • JS个人笔记
    1、引入javascript的几种方式<scripttype="text/javascript">window.alert("hellojs");//alert函数会阻塞整个页面加载的作用,当我们把script放到最前面......
  • UE4学习笔记23——【动画】Mixamo自动绑骨并导入虚幻4
    P61.Mixamo自动绑骨并导入虚幻4P61需要插件“MixamoAnimationRetargeting”(200多块......)(这节课就简单听听,以后用到了再看)(桥豆麻袋!不用买这个插件,这节课的东西也能......
  • opencv笔记(车辆识别实现)
    opencv笔记(车辆计数实现)注意:更准确的车辆计数实现应考虑深度学习。目录opencv笔记(车辆计数实现)基本实现思路涉及知识分步骤代码加载视频通过形态学识别车辆对车辆进......
  • django学习笔记-ORM
    0.安装第三方模块pipinstallmysqlclient1.ORM1.1.创建数据库启动mysql服务自带工具创建数据库createdatabasedemo01DEFAULTCHARSETutf8COLLATEutf8_gene......
  • Canvas学习笔记(四)线条操作
    在Canvas中,常见的线条操作属性有:属性说明lineWidth定义线条宽度lineCap定义线帽样式lineJoin定义两个线条交接处的样式常见的线条操作方法有:方......
  • [笔记]docker-compose启动javaweb
    1.Dockfile1准备jdk安装包启动项目jar2文件fromcentosrunmkdir/var/tmp/jdkCOPYjdk-8u321-linux-x64.tar.gz/var/tmp/jdkRUNtarxzf/var/tmp/jdk/jdk-8......
  • Raft笔记
    内容参考自:解读共识算法Raft(1)简介和状态简化出自Lamport的《InSearchofanUnderstandableConsensusAlgorithm》1.Raft把共识算法分为三个子问题:LeaderElection、L......
  • (笔记)关于Typora提示”This beta version of Typora is expired...“的解决办法
      一、问题使用老版本Typora时,会提示下文,并跳转至typora官网,从而没有使用。  二、解决办法修改Typora相应注册表的权限(作为旧版本失效后的一种补充):打开......
  • UML画图笔记
    提纲:1:面向对象技术2:模型与可视化建模3:什么是UML4:UML发展历史5:软件过程6:UML工具7:UML构成8:UML实例9:UML在软件开发各个阶段的应用。 一:面向对象技术二:软件质......
  • 操作系统笔记
    第一章一:什么是操作系统覆盖在硬件和操作软件中间的一个系统,和硬件部分相互作用,主要起一个承上启下的任务二:资源的管理者现代计算机支持多任务,多......