展开运算符就是3个点(…),相信大家对些并不陌生,因为我们经常在项目中能看到它的影子,他可以简化我们的代码,看起来更加优雅。现在看看下面几个demo示例,都是我们工作中可能要用到的。

数组扩展运算符

1.合并数组
    let arr1 = [0, 1, 2];let arr2 = [3, 4, 5];//写法1arr1.push(...arr2);console.log(arr1);//[0, 1, 2, 3, 4, 5]//写法2arr1 = [...arr2,...arr1]console.log(arr1);//[3,4,5,0,1,2,3,4,5]
2.与解构赋值结合
    const [first, ...rest] = [1, 2, 3, 4, 5];console.log(rest) //[2, 3, 4, 5]console.log(first) // 1
3.函数传参中的最后一个形参
const fn = (arg1,arg2,arg3) => {//do something
}let arr = [1,2,3]
fn(...arr);

当作函数调用的时候,就是把每个参数扩展开来当作函数的一个参数来传进去,注意,只有函数调用时,扩展运算符才可以放在圆括号中,否则会报错。

4.复制数组

以前我们复制一个数组的时候,我们经常这样写

const a1 = [1, 2];
const a2 = a1.concat();
a2[0] = 2;
console.log(a1) // [1, 2]

上面代码中,a1会返回原数组的克隆,再修改a2就不会对a1产生影响;

有了扩展运算符,我们把上面的代码就可以简化成以下:

const a1 = [1,2];
//你可以这么写:
const a2 = [...a1]
//也可以这么写:
const [...a2] = a1

对象扩展运算符

1.合并对象
let obj1 = {name:'张三'
}
let obj2 = {address:'文西3路89号'
}
let obj3 = {age:'24'
}
let obj4 = {...obj1,...obj2,...obj3};
console.log(obj4);//{name: "张三", address: "文西3路89号", age: "24"}
2.复制对象
let obj4 = {name: "李四", address: "西苑89号", age: "26"};
let obj5 = {...obj4}; //或者这么写:{...obj5} = obj4;
console.log(obj5)//{name: "李四", address: "西苑89号", age: "26"};
3.结构赋值
let { A, B, ...C } = { A: 1, B: 2, a: 3, b: 4 };
A // 1
B // 2
C // { a: 3, b: 4 }

上面代码中,变量 C 是解构赋值所在的对象。它获取等号右边的所有尚未读取的键(a和b),将它们连同值一起拷贝过来。

由于解构赋值要求等号右边是一个对象,所有如果等号右边是 undefined 或 null,就会报错,因为它们无法转为对象。

let { A, B, ...C } = null; // 运行时错误
let { A, B, ...C } = undefined; // 运行时错误

解构赋值必须是最后一个参数,否则报错。

let { ...A, B, C } = obj; // 句法错误
let { A, ...B, ...C } = obj; // 句法错误
//Uncaught SyntaxError: Rest element must be last element

上面代码中,解构赋值不是最后一个参数,所以会报错。
注意,解构赋值的拷贝是浅拷贝,即如果一个键的值是复合型的值(数组、对象、函数)、那么解构赋值拷贝的是这个值的引用,而不是这个值的副本。看下面示例:

let obj = { a: { b: 9 },c:8 };
let d = {...obj};//也可以这么写 let {...d} = obj;
obj.a.b = 2;
console.log(d.a.b) // 2

上面代码中,d是解构赋值所在的对象,拷贝了对象 obj 的 a 属性。a 属性引用了一个对象,修改这个对象的值,会影响到解构赋值对它的引用。

展开运算符,需要我们在平时项目中多练练,能用…做到的就尽量用…, 这样会越来越熟练,本文只做一些简单的示范,重点是自己在项目中熟练运用。

展开运算符在项目中的轻度运用相关推荐

  1. 06-ES6语法:展开运算符

    本文我们介绍ES6的展开运算符.展开运算符(spread operator)允许一个表达式在某处展开.展开运算符在多个参数(用于函数调用)或多个元素(用于数组字面量)或者多个变量(用于解构赋值)的地方 ...

  2. JavaScript - 展开运算符

    在ES6中,使用 - 来表示展开运算符,它可以展开数组/对象. 一.展开运算符-在数组中的使用 展开一个数组 const arr = [1,2,3] ;console.log(...arr); //输 ...

  3. ES6中展开运算符的深拷贝浅拷贝理解(ElementUI表格点击编辑,模态框内容与表格数据一起变的问题)

    项目中遇到的问题: 在elementui中表格点击按钮传值的时候,通过bus中的$emit传对象,在弹出的模态框中用bus的$on接收对象,然后对传的对象进行改变,结果发现改变了原表格的数据. 然后就 ...

  4. ES6展开运算符(...)

    这是在网上看见的es6展开运算符的总结,原文地址:http://www.jianshu.com/p/c5230c11781b 作者:可木Changer 链接:http://www.jianshu.co ...

  5. 2021年C++项目中的十大Bug:乍一看都正确的代码,实则暗藏玄机

    作者 | Vladislav Stolyarov 译者 | 弯月 出品 | CSDN(ID:CSDNnews) 在程序员的新年祝福中,大家或多或少会来一句,新年编码无Bug.Bug越写越少--对程序员 ...

  6. MySQL基本增删改查以及搭配node在项目中的操作

    目录 一.数据库简单介绍 二.进一步了解MySQL 三.安装MySQL并配置 四.使用SQL语句管理数据库 1.SQL语言中的注释 2.SELECT查询语句 3.INSERT INTO插入语句 4.U ...

  7. JavaScript代码 在项目中高效、快速开发

    JavaScript单行代码 在项目中高效开发 数组 / 对象 / 变量 1.删除数组中的重复值 2.删除数组对象的重复值 3.展平一个数组 4.从数组中删除虚假值 / 过滤数组中值为 false 的 ...

  8. 在vue项目中引入vuex(全局状态管理器)

    目录 Vuex是什么? State Getter Mutation Action Module 项目结构 Vuex是什么? Vuex是一个专为Vue.js应用程序开发的状态管理模式.它采用集中式存储管 ...

  9. 在vue项目中引用vuex状态管理工具

    在vue项目中引用vuex状态管理工具 一.vuex是什么? 二.使用步骤 1.引入库 2.在main.js文件引入配置 3.配置store/index.js文件 4.获取state数据 5.获取ge ...

最新文章

  1. Hadoop_MapReduce的基本应用
  2. 第三代测序为什么这么贵?
  3. Alpha冲刺Day10
  4. ArcGIS Pro发布三维场景服务
  5. Python教程: 闭包及陷阱
  6. C# 8 新特性 - 可空引用类型
  7. linux python 永久添加自己的模块路径
  8. @NotBlank注解地正确使用
  9. Awvs 12.x安装教程
  10. 【渗透测试】kali使用教程(一):常用命令和基本工具使用
  11. 一线二线城市工作的区别
  12. 如何在unity上放置3d图片
  13. libnids中TCP/IP栈实现细节分析——TCP会话重组
  14. java8_我是如何优雅的使用Optional的
  15. 高精度练习之超大整数开根
  16. 如何查看一个vs工程使用的vs版本是哪一个?
  17. 800行Python代码实现双十一自动登录抢购商品,这速度女友很爱
  18. 【计算+大数据】-武汉理工大学主办-2021年第四届计算与大数据国际会议(ICCBD 2021)
  19. 基于Python的经纬度与xy坐标系相互转换
  20. 关于西门子PC Adapter USB对于PPI协议的支持问题的结论(2015-10-19相反的结论):

热门文章

  1. 彩色流程图怎么做?这样的操作方法你尝试过吗?
  2. 地震--《孩子,快抓紧妈妈的手》
  3. 易语言魔兽世界怀旧服自动钓鱼源码
  4. AttributeError: ‘Upsample‘ object has no attribute ‘recompute_scale_factor‘
  5. 什么是百度信息流广告?
  6. 实战 | OpenCV如何将不同轮廓合并成一个轮廓(附Python / C++源码)
  7. Openlayers之加载Stamen地图
  8. 对项目成本和进度的监控----挣值分析
  9. 给定激励,求零输入响应、零状态响应,全响应
  10. web期末大作业-前端网页--H5--海贼王动态网页源码-海贼王网页