… ES6的扩展运算符

  • 扩展运算符可以将数据展开
  • 不能单独使用扩展运算符展开数组,可以在参数中使用,将参数数组转成参数列表。
  • 如果扩展运算符后面跟的是变量,那么接受单独多余的数组放置到数组中。

扩展运算符允许一个表达式在多个参数(用于函数调用)或多个元素(用于数组字面量)或多个变量(用于解构赋值)的位置扩展。

数组使用

1.将一个数组放到另一个数组中

// 没有用扩展运算符的情况下
let arr1 = [1,2,3,4]
let arr2 = [arr1,5,6,7,8]
console.log(arr2)// [[1,2,3,],5,6,7,8]//使用的情况下
let arr1 = [1,2,3,4]
let arr2 = [...arr1,5,6,7,8]
console.log(arr2)// [1, 2, 3, 4, 5, 6, 7, 8]

2.复制数组

let arr1 = [1,2,3]
let arr2 = [...arr1]
console.log(arr2)//[1,2,3]

arr1数组中的元素扩展成为单独元素被分配到arr2中。现在可以随意改变arr2数组,且都不会对源数组arr产生影响因为arr1数组值被扩展后添加到arr2数组中,我们设置arr2等于arr1的值,而不是其本身。

3.数组拼接

let arr1 = [1,2,3]
let arr2 = [4,5,6]arr1 = [...arr1,...arr2]console.log(arr1)//[1, 2, 3, 4, 5, 6]

4.运用在Math

let arr = [1,2,3,4,5,6];
// Math.max()将返回一组数最大值。
// 在没有扩展运算符,在数组上使用Math.max()最容易方法就是使用.apply()。
let result = Math.max.apply(null,arr)
console.log(result) //6
// 现在看看使用扩展运算符做同样事情。只需要两行代码就可以做到同样效果。
let result1 = Math.max(...arr)
console.log(result1) //6

5.字符串转数组

let str = 'hello'
let arrChars = [...str]
console.log(arrChars)//["h", "e", "l", "l", "o"]

6.用于展开数据结构,数组去重

let arr = [1,2,3,4,5,6,7,7,8,7,7];console.log(...new Set(arr))//1 2 3 4 5 6 7 8

对象使用

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

let obj1 = { a: 1, b: 2 };
let obj2 = { ...obj1 }; // { a: 1, b: 2 }
//等同于
let obj1 = { a: 1, b: 2 };
let obj2 = Object.assign({}, obj1); // { a: 1, b: 2 }

Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。

Object.assign方法的第一个参数是目标对象,后面的参数都是源对象。(如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性)。
用扩展运算符对数组或者对象进行拷贝时,只能扩展和深拷贝第一层的值,对于第二层极其以后的值,扩展运算符将不能对其进行打散扩展,也不能对其进行深拷贝,即拷贝后和拷贝前第二层中的对象或者数组仍然引用的是同一个地址,其中一方改变,另一方也跟着改变。

补充:扩展运算符和Object.assign()都不是深拷贝

扩展运算符:

let outObj = {inObj: {a: 1, b: 2}
}
let newObj = {...outObj}
newObj.inObj.a = 2
console.log(outObj) // {inObj: {a: 2, b: 2}}

Object.assign():

let outObj = {inObj: {a: 1, b: 2}
}
let newObj = Object.assign({}, outObj)
newObj.inObj.a = 2
console.log(outObj) // {inObj: {a: 2, b: 2}}

当然,如果只有一层嵌套还是可以的,那要看数据结构怎么设计的。

如果要实现深拷贝呢?

有一个简单的办法: JSON.parse(JSON.stringify())。

let outObj = {inObj: {a: 1, b: 2}
}
let newObj = JSON.parse(JSON.stringify(outObj))
console.log(newObj); // {inObj: {a: 1, b: 2}}
newObj.inObj.a = 2
console.log(outObj); // {inObj: {a: 1, b: 2}}

我知道一个:不能拷贝函数。当然,还有其他问题,比如正则会变成对象等。

let outObj = {foo: 1,bar: function() {},inObj: { a: 1, b: 2}
}
let newObj = JSON.parse(JSON.stringify(outObj))
console.log(newObj) // {foo: 1, inObj: {a: 1, b: 2}}

也可以自己实现,拿到所有可枚举属性:

const deepClone = (obj) => {  if (typeof obj !== 'object') returnlet newObj = obj instanceof Array ? [] : {}  for (let key in obj) {    if (typeof obj[key] === 'object') {      newObj[key] = deepClone(obj[key])    } else {      newObj[key] = obj[key]    }  }return newObj
}let outObj = {foo: 1,bar: function() {},inObj: { a: 1, b: 2}
}
let ooo = deepClone(outObj)
console.log(ooo) // {bar: ƒ (), foo: 1, inObj: {a: 1, b: 2}}
ooo.inObj.a = 2
console.log(outObj) // {bar: ƒ (), foo: 1, inObj: {a: 1, b: 2}}

如果你还不满意,去引个deepclone的库好了。

扩展运算符用法实例总结相关推荐

  1. 三元运算符java 案例_javascript三元运算符用法实例

    三元运算符用法实例: 如名字表示的三元运算符需要三个操作数. 语法是 条件 ? 结果1 : 结果2;. 这里你把条件写在问号(?)的前面后面跟着用冒号(:)分隔的结果1和结果2.满足条件时结果1否则结 ...

  2. ES6扩展运算符用法

    扩展运算符可以将数组或者对象转为用逗号分隔的参数序列 扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象中 用法: 1.将一个数组放入另一个数组中 var middle = [3, ...

  3. es6之三个点(...) 扩展运算符数组和对象的使用场景及最常见的用法(霸霸看了都说好)

    概念 es6之扩展运算符 (-) 简称三个点 数组的扩展运算符应用 复制数组 扩展运算符提供了复制数组的简便写法. const a1 = [1, 2]; // 写法一 const a2 = [...a ...

  4. ES6高级:扩展运算符,箭头函数,class类,iterator迭代器

    2. 扩展运算符 ... 2.1 reset参数 reset参数==必须放在最后==,为了替代arguments,在函数形参中使用,==接受剩余参数==,以==数组==的形式去接受 //1. rese ...

  5. 九、数组的扩展(扩展运算符)

    文章目录 1. 扩展运算符 1.1 含义 1.2 替代函数的 ES5: apply() 方法 1.3 扩展运算符的应用 1.3.1 复制数组 1.3.2 合并数组 1.3.3 与解构赋值结合,会生成 ...

  6. node 之 ... 扩展运算符报错

    使用pm2的遇到的问题:(实际上是 node 版本不一致导致的问题) 描述:sudo 下的node版本和 全局下的node版本不一致导致...扩展运算符报错. 实例: { "apps&quo ...

  7. cube、rollup及exec的用法实例

    为什么80%的码农都做不了架构师?>>>    cube.rollup及exec的用法实例 select sdept 系部,sno 学号,max(sage) 最大年龄,   grou ...

  8. Windows 外壳扩展编程入门实例

    Windows 外壳扩展编程入门实例 -- Delphi 篇 作者的话 关于Windows 外壳扩展方面的文章私心以为最好的应当算是Michael Dunn 的TheComplete Idiot's ...

  9. PHP中的常见魔术方法功能作用及用法实例

    这篇文章主要介绍了PHP中的常见魔术方法功能作用及用法实例,本文讲解了构造函数和析构函数__construct()和__desctruct()以及属性重载(Property Overloading)_ ...

最新文章

  1. 线程的创建与启动——Thread 类有两个常用的构造方法:Thread()与 Thread(Runnable)||多线程运行结果是随机的
  2. php 查找键名,array_key_exists()函数搜索数组键名步骤详解
  3. flex学习网站大全(转)
  4. 在rac集群上开启OEM
  5. php员工删除,php+mysql删除指定编号员工信息的方法_PHP
  6. Python爬虫:用BeautifulSoup进行NBA数据爬取
  7. 基本完成的重力空间的对任意形状的碰撞子系统
  8. WCF服务启动时遇到AddressAccessDeniedException
  9. P2P 终结者 IP雷达
  10. TB6612驱动和MG513P3012V电机
  11. JavaScript设计模式——观察者模式
  12. 财经大数据可视化Vdc平台_为何要使用大数据可视化平台
  13. 台式电脑投影切屏快捷键_电脑投影切屏快捷键
  14. macpro如何清理磁盘空间_Mac系统空间占用太大,如何清理磁盘空间
  15. 2018网络小说年度热词盘点
  16. 步进电机 高速光耦_光耦的参数以及高速光耦如何选型!-先进光半导体
  17. FineCMS 5.0.10漏洞集合
  18. 【入门级】Hibernate环境搭建
  19. 计算机主机的跳线怎么接,手把手教你台式机电脑主板跳线接法
  20. 一句话木马、中国菜刀、图片一句话制作、过狗一句话

热门文章

  1. 面向对象三大特征(封装、继承、多态)详解
  2. 【整理向】OJ上一些不(jiao)错(shui)的背包题
  3. 酷我音乐爬虫(400多行代码)
  4. aws api gateway 构建一个私有的REST API
  5. 提高自己魅力的九阴真经
  6. 改版的PMP很难吗?新考纲3大模块都包含哪些内容?如何提高通过率?
  7. 深度学习中的知识蒸馏技术!
  8. 【一周酷炫智能产品回顾】有筹必报第9期:投影表+牛冰箱+提肛球+喵星人+Geek开发板...
  9. 引入txtai,这是一种基于Transformers的AI驱动的搜索引擎
  10. js 获取滚动条的高度