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 Event学习第三章 早期的事件处理程序
Feb 07 Javascript
JavaScript的事件绑定(方便不支持js的时候)
Oct 01 Javascript
动态加载jquery库的方法
Feb 12 Javascript
node.js中实现同步操作的3种实现方法
Dec 05 Javascript
JavaScript中的Math.sin()方法使用详解
Jun 15 Javascript
js生成随机颜色方法代码分享(三种)
Dec 29 Javascript
如何制作幻灯片(代码分享)
Jan 06 Javascript
jQuery滚动插件scrollable.js用法分析
May 25 jQuery
JS获取填报扩展单元格控件的值的解决办法
Jul 14 Javascript
vue 修改 data 数据问题并实时显示的方法
Aug 27 Javascript
如何基于filter实现网站整体变灰功能
Apr 17 Javascript
Vue指令实现OutClick的示例
Nov 16 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具体实现代码
2010/10/12 PHP
PHP采用XML-RPC构造Web Service实例教程
2014/07/16 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
2014/10/15 PHP
PHP比你想象的好得多
2014/11/27 PHP
php中smarty模板条件判断用法实例
2015/06/11 PHP
laravel 5.3中自定义加密服务的方案详解
2017/05/09 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
2020/08/17 PHP
强悍无比的WEB开发好助手FireBug(Firefox Plugin)
2007/01/16 Javascript
JavaScript 保存数组到Cookie的代码
2010/04/14 Javascript
javascript:文字不间断向左移动的实例代码
2013/08/08 Javascript
JQuery仿小米手机抢购页面倒计时效果
2014/12/16 Javascript
JavaScript中Math对象的方法介绍
2017/01/05 Javascript
three.js快速入门【推荐】
2017/01/21 Javascript
JS滚动到指定位置导航栏固定顶部
2017/07/03 Javascript
elementui的默认样式修改方法
2018/02/23 Javascript
Vue在页面右上角实现可悬浮/隐藏的系统菜单
2018/05/04 Javascript
AngularJs1.x自定义指令独立作用域的函数传入参数方法
2018/10/09 Javascript
vue使用prop可以渲染但是打印台报错的解决方式
2019/11/13 Javascript
在antd4.0中Form使用initialValue操作
2020/11/02 Javascript
JS模拟实现京东快递单号查询
2020/11/30 Javascript
python 测试实现方法
2008/12/24 Python
Python在线运行代码助手
2016/07/15 Python
Python实现读取文件最后n行的方法
2017/02/23 Python
Python程序退出方式小结
2017/12/09 Python
浅述python中深浅拷贝原理
2018/09/18 Python
Python3中的最大整数和最大浮点数实例
2019/07/09 Python
对Django外键关系的描述
2019/07/26 Python
django框架两个使用模板实例
2019/12/11 Python
利用Python如何画一颗心、小人发射爱心
2021/02/21 Python
CSS3对背景图片的裁剪及尺寸和位置的设定方法
2016/03/07 HTML / CSS
HTML5 Canvas实现放大镜效果示例
2020/03/25 HTML / CSS
巴西美妆购物网站:Kutiz Beauté
2019/03/13 全球购物
区政府领导班子个人对照检查材料
2014/09/25 职场文书
委托公证书格式
2015/01/26 职场文书
2019年浪漫婚礼证婚词
2019/06/27 职场文书