es6之三个点(...) 扩展运算符数组和对象的使用场景及最常见的用法(霸霸看了都说好)
概念
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之三个点(...) 扩展运算符数组和对象的使用场景及最常见的用法(霸霸看了都说好)相关推荐
- [vue] 分别说说vue能监听到数组或对象变化的场景,还有哪些场景是监听不到的?无法监听时有什么解决方案?
[vue] 分别说说vue能监听到数组或对象变化的场景,还有哪些场景是监听不到的?无法监听时有什么解决方案? 无法监听时的方案: 数组:改变数组的值:this.$set() 改变数组长度:arr.sp ...
- javascript ES6 新特性之 扩展运算符 三个点 ...
对于 ES6 新特性中的 ... 可以简单的理解为下面一句话就可以了: 对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中. 作用类似于 Object.assign() ...
- ES6新特性_ES6扩展运算符的应用---JavaScript_ECMAScript_ES6-ES11新特性工作笔记014
然后我们再来看一下 es6扩展运算符的应用 首先可以用来合并数组 可以看到 以前我们合并可以用数组的.concat来实现 现在我们可以这样,用扩展运算符,...,...来实现拼接对吧. 可以看到效果 ...
- ES6新特性_ES6扩展运算符的介绍---JavaScript_ECMAScript_ES6-ES11新特性工作笔记013
接下来去看es6的扩展运算符 比如我声明一个常量数组tfboys=['','','']; 然后写一个函数,chunwan,然后 chunwan(tfboys);调用以后可以看到右边打印出来了,可以看到 ...
- ES6 rest参数,扩展运算符,Symbol数据类型,迭代器和生成器 【详解加案例 】(二)
文章目录 1.ES6 rest 参数 2. ES6 扩展运算符 2.1 ES6 简介 2.2 应用 3. ES6 Symbol 数据类型 3.1 Symbol两种创建方式 3.2 Symbol注意事项 ...
- ES6新特性之扩展运算符
扩展运算符 扩展运算符(spread)是三个点(...), 将一个数组转为用逗号分隔的参数序列 . 用法: <script>console.log(...[1,2,3]);console. ...
- ES6数据部分(字符串,数组,对象,symbol,set,map)
概括:ES6数据部分 讲到的内容 都是针对 ES5的拓展功能 字符串 模板字符串 语法: `字符串内容` 应用场景:多用于 要在字符串内容中 进行插值 插值语法 `字符串内容${要插入的内容(变量.常 ...
- es6方法过滤掉两个数组中对象id值相等的项
let arr1=[{id:1,name:'张三'},{id:2,name:'李四'}] let arr2=[{id:1,name:'张三'},{id:3,name:'王五'},{id:44,name ...
- ES6之三个点(扩展运算符及rest运算符)
ES6中出现了三个点的写法,初次看到一脸懵逼,现在让我们好好来搞清楚这三个点... 首先需要了解的是在ES6中新增了扩展运算符和rest参数,而这两个都是用...三个点来表示的(麻蛋就不能用不同的表示 ...
最新文章
- Imagenet VGG-19网络加载和特征可视化
- 网站优化中搜索引擎为何重视原创内容呢?
- vi 整行 多行 复制与粘贴
- STM32 HAL库--串口的DMA(发送、接收)和esp8266 wifi模组发送和接收封装函数
- iOS下KVO使用过程中的陷阱
- 秒杀系统设计的 5 个要点:前端三板斧+后端两条路
- mysql建立从库同时备份_mysql主从库配置读写分离以及备份
- (138)FPGA面试题-Verilog HDL中function和task的区别(二)
- Linux下的指令:tail
- zend studio 10 实现代码自动换行
- xlsx文件打开乱码_我的 EXCEL 工作表打开出现乱码?(xlsx文件打开是乱码怎么办)...
- Windows+WSL+DockerDesktop下安装OpenV2X
- esp32摄像显示时间_ESP32彩屏显示入门:我要五彩斑斓的黑,还有五光十色的白
- 谈谈机器视觉的那点事儿!
- 域名前缀和后缀html,为什么域名前要加www前缀,www是什么意思? - 立金哥
- 食品加工企业自营商城小程序开发,帮助企业增加销售渠道,提高销量
- 最新仿山楂岛留言源码+轻量级简约
- I2 2021-02-20-002-知学网
- 在vue项目中实现海康威视IOT云眸平台(实时和回放)
- javascript 基础(76-107)
热门文章
- 【欧拉函数】 欧拉函数计算及打表
- 更换故障POE交换机
- 蓝桥杯C++:BASIC30 阶层计算
- 大数据时代,银行BI应用的方案探讨
- X-Security X的安全控制
- 解决springboot跨域问题No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
- ECALL Swtichless调用及tRTS端Swtichless初始化
- A Survey on Neural Network Interpretability (神经网络的可解释性研究综述)
- Chapter6 数据仓库Hive
- 第57章 SQL LCASE() 函数教程