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 相关文章推荐
jQuery Tools tooltip使用说明
Jul 14 Javascript
javascript和HTML5利用canvas构建猜牌游戏实现算法
Jul 17 Javascript
利用JS来控制键盘的上下左右键(示例代码)
Dec 14 Javascript
JQuery页面地址处理插件jqURL详解
May 03 Javascript
jquery判断输入密码两次是否相等
Apr 22 Javascript
深入理解jQuery中的事件冒泡
May 24 Javascript
面试常见的js算法题
Mar 23 Javascript
详解angularjs中如何实现控制器和指令之间交互
May 31 Javascript
基于 Vue 的树形选择组件的示例代码
Aug 18 Javascript
JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
Feb 06 Javascript
JavaScript类的继承方法小结【组合继承分析】
Jul 11 Javascript
vue组件数据传递、父子组件数据获取,slot,router路由功能示例
Mar 19 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
php网页后退不再出现过期
2007/03/08 PHP
PHP中返回引用类型的方法
2015/04/03 PHP
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
js判断手机访问或者PC的几个例子(常用于手机跳转)
2015/12/15 Javascript
常用的JQuery函数及功能小结
2016/03/24 Javascript
完美实现八种js焦点轮播图(下篇)
2020/04/20 Javascript
JS仿Base.js实现的继承示例
2017/04/07 Javascript
JS实现自定义状态栏动画文字效果示例
2017/10/12 Javascript
angular2实现统一的http请求头方法
2018/08/13 Javascript
vuejs router history 配置到iis的方法
2018/09/20 Javascript
Vue中对拿到的数据进行A-Z排序的实例
2018/09/25 Javascript
详解Vue依赖收集引发的问题
2019/04/22 Javascript
vue动态设置路由权限的主要思路
2021/01/13 Vue.js
python实现在windows下操作word的方法
2015/04/28 Python
Python中IPYTHON入门实例
2015/05/11 Python
python通过ssh-powershell监控windows的方法
2015/06/02 Python
python微信公众号之关键词自动回复
2018/06/15 Python
python获取当前文件路径以及父文件路径的方法
2019/07/10 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
2019/08/12 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
2020/03/25 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
HTML5响应式(自适应)网页设计的实现
2017/11/17 HTML / CSS
Mamaearth官方网站:印度母婴护理产品公司
2019/10/06 全球购物
普通员工辞职信
2014/01/17 职场文书
五年级音乐教学反思
2014/02/06 职场文书
体育之星事迹材料
2014/05/11 职场文书
志愿者宣传口号
2014/06/17 职场文书
小学生安全责任书
2014/07/25 职场文书
土地租赁协议书
2015/01/29 职场文书
教师个人培训总结
2015/02/11 职场文书
2016七夕情人节感言
2015/12/09 职场文书
Python利器openpyxl之操作excel表格
2021/04/17 Python
英国数字版游戏销量周榜公布 《小缇娜的奇幻之地》登顶
2022/04/03 其他游戏
Java实现添加条码或二维码到Word文档
2022/06/01 Java/Android