概念

es6之扩展运算符 (…) 简称三个点

数组的扩展运算符应用

复制数组

扩展运算符提供了复制数组的简便写法。

const a1 = [1, 2];
// 写法一
const a2 = [...a1];
// 写法二
const [...a2] = a1;
合并数组

扩展运算符提供了数组合并的新写法。

const arr1 = ['a', 'b'];
const arr2 = ['c'];
const arr3 = ['d', 'e'];// ES5 的合并数组
arr1.concat(arr2, arr3);
// [ 'a', 'b', 'c', 'd', 'e' ]// ES6 的合并数组
[...arr1, ...arr2, ...arr3]
// [ 'a', 'b', 'c', 'd', 'e' ]

不过,这两种方法都是浅拷贝,使用的时候需要注意。

与解构赋值结合

扩展运算符可以与解构赋值结合起来,用于生成数组。

const [first, ...rest] = [1, 2, 3, 4, 5];
first // 1
rest  // [2, 3, 4, 5]const [first, ...rest] = [];
first // undefined
rest  // []const [first, ...rest] = ["foo"];
first  // "foo"
rest   // []
字符串

扩展运算符还可以将字符串转为真正的数组。

[...'hello']
// [ "h", "e", "l", "l", "o" ]
实现了 Iterator 接口的对象

下面代码中,querySelectorAll方法返回的是一个NodeList对象。它不是数组,而是一个类似数组的对象。这时,扩展运算符可以将其转为真正的数组,原因就在于NodeList对象实现了 Iterator 。

let nodeList = document.querySelectorAll('div');
let array = [...nodeList];
Map 和 Set 结构,Generator 函数

扩展运算符内部调用的是数据结构的 Iterator 接口,因此只要具有 Iterator 接口的对象,都可以使用扩展运算符,比如 Map 结构。

let map = new Map([[1, 'one'],[2, 'two'],[3, 'three'],
]);let arr = [...map.keys()]; // [1, 2, 3]

Generator 函数运行后,返回一个遍历器对象,因此也可以使用扩展运算符。

const go = function*(){yield 1;yield 2;yield 3;
};[...go()] // [1, 2, 3]

上面代码中,变量go是一个 Generator 函数,执行后返回的是一个遍历器对象,对这个遍历器对象执行扩展运算符,就会将内部遍历得到的值,转为一个数组。

对象的扩展运算符应用

拷贝对象

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

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

上面的例子只是拷贝了对象实例的属性,如果想完整克隆一个对象,还拷贝对象原型的属性,可以采用下面的写法。

// 写法一
const clone1 = {__proto__: Object.getPrototypeOf(obj),...obj
};// 写法二
const clone2 = Object.assign(Object.create(Object.getPrototypeOf(obj)),obj
);// 写法三
const clone3 = Object.create(Object.getPrototypeOf(obj),Object.getOwnPropertyDescriptors(obj)
)

上面代码中,写法一的__proto__属性在非浏览器的环境不一定部署,因此推荐使用写法二和写法三。

合并对象

扩展运算符可以用于合并两个对象。

let ab = { ...a, ...b };
// 等同于
let ab = Object.assign({}, a, b);

如果用户自定义的属性,放在扩展运算符后面,则扩展运算符内部的同名属性会被覆盖掉。

let aWithOverrides = { ...a, x: 1, y: 2 };
// 等同于
let aWithOverrides = { ...a, ...{ x: 1, y: 2 } };
// 等同于
let x = 1, y = 2, aWithOverrides = { ...a, x, y };
// 等同于
let aWithOverrides = Object.assign({}, a, { x: 1, y: 2 });
表达式

与数组的扩展运算符一样,对象的扩展运算符后面可以跟表达式。

const obj = {...(x > 1 ? {a: 1} : {}),b: 2,
};
解构赋值结合

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

let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
x // 1
y // 2
z // { a: 3, b: 4 }

注意,解构赋值的拷贝是浅拷贝,即如果一个键的值是复合类型的值(数组、对象、函数)、那么解构赋值拷贝的是这个值的引用,而不是这个值的副本。

let obj = { a: { b: 1 } };
let { ...x } = obj;
obj.a.b = 2;
x.a.b // 2

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

扩展函数参数

下面代码中,原始函数baseFunction接受a和b作为参数,函数wrapperFunction在baseFunction的基础上进行了扩展,能够接受多余的参数,并且保留原始函数的行为。

function baseFunction({ a, b }) {// ...
}
function wrapperFunction({ x, y, ...restConfig }) {// 使用 x 和 y 参数进行操作// 其余参数传给原始函数return baseFunction(restConfig);
}

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

  1. [vue] 分别说说vue能监听到数组或对象变化的场景,还有哪些场景是监听不到的?无法监听时有什么解决方案?

    [vue] 分别说说vue能监听到数组或对象变化的场景,还有哪些场景是监听不到的?无法监听时有什么解决方案? 无法监听时的方案: 数组:改变数组的值:this.$set() 改变数组长度:arr.sp ...

  2. javascript ES6 新特性之 扩展运算符 三个点 ...

    对于 ES6 新特性中的 ... 可以简单的理解为下面一句话就可以了: 对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中. 作用类似于 Object.assign() ...

  3. ES6新特性_ES6扩展运算符的应用---JavaScript_ECMAScript_ES6-ES11新特性工作笔记014

    然后我们再来看一下 es6扩展运算符的应用 首先可以用来合并数组 可以看到 以前我们合并可以用数组的.concat来实现 现在我们可以这样,用扩展运算符,...,...来实现拼接对吧. 可以看到效果 ...

  4. ES6新特性_ES6扩展运算符的介绍---JavaScript_ECMAScript_ES6-ES11新特性工作笔记013

    接下来去看es6的扩展运算符 比如我声明一个常量数组tfboys=['','','']; 然后写一个函数,chunwan,然后 chunwan(tfboys);调用以后可以看到右边打印出来了,可以看到 ...

  5. ES6 rest参数,扩展运算符,Symbol数据类型,迭代器和生成器 【详解加案例 】(二)

    文章目录 1.ES6 rest 参数 2. ES6 扩展运算符 2.1 ES6 简介 2.2 应用 3. ES6 Symbol 数据类型 3.1 Symbol两种创建方式 3.2 Symbol注意事项 ...

  6. ES6新特性之扩展运算符

    扩展运算符 扩展运算符(spread)是三个点(...), 将一个数组转为用逗号分隔的参数序列 . 用法: <script>console.log(...[1,2,3]);console. ...

  7. ES6数据部分(字符串,数组,对象,symbol,set,map)

    概括:ES6数据部分 讲到的内容 都是针对 ES5的拓展功能 字符串 模板字符串 语法: `字符串内容` 应用场景:多用于 要在字符串内容中 进行插值 插值语法 `字符串内容${要插入的内容(变量.常 ...

  8. es6方法过滤掉两个数组中对象id值相等的项

    let arr1=[{id:1,name:'张三'},{id:2,name:'李四'}] let arr2=[{id:1,name:'张三'},{id:3,name:'王五'},{id:44,name ...

  9. ES6之三个点(扩展运算符及rest运算符)

    ES6中出现了三个点的写法,初次看到一脸懵逼,现在让我们好好来搞清楚这三个点... 首先需要了解的是在ES6中新增了扩展运算符和rest参数,而这两个都是用...三个点来表示的(麻蛋就不能用不同的表示 ...

最新文章

  1. Imagenet VGG-19网络加载和特征可视化
  2. 网站优化中搜索引擎为何重视原创内容呢?
  3. vi 整行 多行 复制与粘贴
  4. STM32 HAL库--串口的DMA(发送、接收)和esp8266 wifi模组发送和接收封装函数
  5. iOS下KVO使用过程中的陷阱
  6. 秒杀系统设计的 5 个要点:前端三板斧+后端两条路
  7. mysql建立从库同时备份_mysql主从库配置读写分离以及备份
  8. (138)FPGA面试题-Verilog HDL中function和task的区别(二)
  9. Linux下的指令:tail
  10. zend studio 10 实现代码自动换行
  11. xlsx文件打开乱码_我的 EXCEL 工作表打开出现乱码?(xlsx文件打开是乱码怎么办)...
  12. Windows+WSL+DockerDesktop下安装OpenV2X
  13. esp32摄像显示时间_ESP32彩屏显示入门:我要五彩斑斓的黑,还有五光十色的白
  14. 谈谈机器视觉的那点事儿!
  15. 域名前缀和后缀html,为什么域名前要加www前缀,www是什么意思? - 立金哥
  16. 食品加工企业自营商城小程序开发,帮助企业增加销售渠道,提高销量
  17. 最新仿山楂岛留言源码+轻量级简约
  18. I2 2021-02-20-002-知学网
  19. 在vue项目中实现海康威视IOT云眸平台(实时和回放)
  20. javascript 基础(76-107)

热门文章

  1. 【欧拉函数】 欧拉函数计算及打表
  2. 更换故障POE交换机
  3. 蓝桥杯C++:BASIC30 阶层计算
  4. 大数据时代,银行BI应用的方案探讨
  5. X-Security X的安全控制
  6. 解决springboot跨域问题No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
  7. ECALL Swtichless调用及tRTS端Swtichless初始化
  8. A Survey on Neural Network Interpretability (神经网络的可解释性研究综述)
  9. Chapter6 数据仓库Hive
  10. 第57章 SQL LCASE() 函数教程