JavaScript剩余操作符Rest Operator详解


Posted in Javascript onJuly 20, 2019

剩余操作符

之前这篇文章JavaScript展开操作符(Spread operator)介绍讲解过展开操作符。剩余操作符和展开操作符的表示方式一样,都是三个点 '…',但是他们的使用场景会不同。

剩余参数

定义函数的时候,如果函数的参数以… 为前缀,则改参数是剩余参数(rest parameter)。剩余参数表示参数个数不确定的参数列表。在函数被调用时,该形参会成为一个数组,数组中的元素都是传递给该函数的多出来的实参的值。

获取参数

剩余操作符可以用来方便地获取传进来的参数。

function sum(a,b,...args){
 console.log(args.length); // 传进来的参数的个数 3
 let s = a + b;
 if(args && args.length){
  args.forEach(i => {s += i});
 } 
 return s;
}
sum(1, 2, 3, 4, 5 ); // 传进来的参数的个数 3

其中第一个形参a对应的是1,第二个形参b对应的2,…args表示的就是[3, 4, 5]。

和arguments的差别

上面剩余参数args是一个数组,而函数的arguments是一个伪数组。应此剩余参数可以使用数组的相关方法sort,map,forEach,pop,而arguments不能。

arguments想要变成数组,可以通过Array.prototype.slice.call方法,使用剩余操作符可以避免将arguments转为数组的麻烦。

// 下面的代码模拟了剩余数组
function sum(a,b,){
 var args = Array.prototype.slice.call(arguments, sum.length); 
 console.log(args.length); // 传进来的参数的个数 3
 let s = a + b;
 args.forEach(i => {s += i});
 return s;
}
sum(1, 2, 3, 4, 5 );

而使用剩余操作符,则不需要转化,直接使用,更加方便。

剩余操作符与解构赋值

我们知道,ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。 比如如下代码:

let array = [1,2,3]
let [a,b,c] = array; // a 1, b 2, c 3

再比如如下代码:

let obj = {a:1,b:2,c:3}
let {a,b,c} = obj; // a 1, b 2, c 3

在解构赋值时,可以使用剩余操作符。剩余操作符所操作的变量会匹配在解构赋值中所有其他变量未匹配到的属性。
比如如下代码,others会匹配到first和second对于属性的余下的属性:

const { first, second, ...others } = {
 first: 1,
 second: 2,
 third: 3,
 fourth: 4,
 fifth: 5
}

first // 1
second // 2
others // { third: 3, fourth: 4, fifth: 5 }

对象中余下的属性值被打包起来构造一个新的对象赋值给了others。

数组也可以通过剩余操作符,把剩余的元素打包成一个新的数组赋值给剩余属性,代码如下:

let array = [1,2,3,4,5];
let [a,b,...c] = array; // a 1,b 2, c [3,4,5]

剩余操作符和展开操作符

某种程度上,可以任务剩余操作符是展开操作符的相反操作。展开操作符会”展开“数组编程多个元素,剩余操作符会把多个元素压缩成一个单一的元素。

Javascript 相关文章推荐
JavaScript this 深入理解
Jul 30 Javascript
jquery中的查找parents与closest方法之间的区别
Dec 02 Javascript
纯js写的分页表格数据为json串
Feb 18 Javascript
基于JS实现PHP的sprintf函数实例
Nov 14 Javascript
学习JavaScript设计模式之中介者模式
Jan 14 Javascript
jQuery在header中设置请求信息的方法
Mar 06 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
Apr 27 Javascript
基于js中document.cookie全面解析
Sep 14 Javascript
vue2.0在table中实现全选和反选的示例代码
Nov 04 Javascript
Vue的路由动态重定向和导航守卫实例
Mar 17 Javascript
vue使用微信JS-SDK实现分享功能
Aug 23 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
Sep 11 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
Jul 20 #Javascript
基于vue 实现表单中password输入的显示与隐藏功能
Jul 19 #Javascript
el-input 标签中密码的显示和隐藏功能的实例代码
Jul 19 #Javascript
Android 自定义view仿微信相机单击拍照长按录视频按钮
Jul 19 #Javascript
使用element-ui的el-menu导航选中后刷新页面保持当前选中状态
Jul 19 #Javascript
Vue实战教程之仿肯德基宅急送App
Jul 19 #Javascript
微信小程序 扭蛋抽奖机css3动画实现详解
Jul 19 #Javascript
You might like
成为好程序员必须避免的5个坏习惯
2014/07/04 PHP
PHP实现一维数组转二维数组的方法
2015/02/25 PHP
javascript中的window.location.search方法简介
2013/09/02 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
2014/06/24 Javascript
javascript实现超炫的向上滑行菜单实例
2015/08/03 Javascript
jQuery基础知识点总结(必看)
2016/05/31 Javascript
Nuxt使用Vuex的方法示例
2019/09/06 Javascript
python操作MySQL数据库具体方法
2013/10/28 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
使用Python写CUDA程序的方法
2017/03/27 Python
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
Python实现按逗号分隔列表的方法
2018/10/23 Python
Python利用heapq实现一个优先级队列的方法
2019/02/03 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
Python 实现数据结构-循环队列的操作方法
2019/07/17 Python
python数据分析工具之 matplotlib详解
2020/04/09 Python
经验丰富程序员才知道的8种高级Python技巧
2020/07/27 Python
Python将字典转换为XML的方法
2020/08/01 Python
python获取百度热榜链接的实例方法
2020/08/25 Python
详解纯CSS3制作的20种loading动效
2017/07/05 HTML / CSS
HTML5使用DOM进行自定义控制示例代码
2013/06/08 HTML / CSS
html5 postMessage解决跨域、跨窗口消息传递方案
2016/12/20 HTML / CSS
Habitat家居英国官方网站:沙发、家具、照明、厨房和户外
2019/12/12 全球购物
院药学专业个人求职信
2013/09/21 职场文书
新郎父亲婚宴答谢词
2014/01/11 职场文书
超市仓管员岗位职责
2014/04/07 职场文书
小学生评语集锦
2014/04/18 职场文书
会计试用期自我评价
2014/09/19 职场文书
幼儿园法制宣传日活动总结
2014/11/01 职场文书
先进党员事迹材料
2014/12/24 职场文书
考研复习计划
2015/01/19 职场文书
优秀员工演讲稿
2019/06/21 职场文书
JavaScript canvas实现流星特效
2021/05/20 Javascript
Java生成读取条形码和二维码的简单示例
2021/07/09 Java/Android
MySQL优化常用的19种有效方法(推荐!)
2022/03/17 MySQL
mysql 生成连续日期及变量赋值
2022/03/20 MySQL