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 相关文章推荐
js解析与序列化json数据(三)json的解析探讨
Feb 01 Javascript
js控制web打印(局部打印)方法整理
May 29 Javascript
jquery live()调用不存在的解决方法
Feb 26 Javascript
javascript实现密码验证
Nov 10 Javascript
拥Bootstrap入怀——导航栏篇
May 30 Javascript
Vue的Class与Style绑定的方法
Sep 01 Javascript
Vue服务器渲染Nuxt学习笔记
Jan 31 Javascript
vue在手机中通过本机IP地址访问webApp的方法
Aug 15 Javascript
解决vue props 拿不到值的问题
Sep 11 Javascript
Angular中使用ng-zorro图标库部分图标不能正常显示问题
Apr 22 Javascript
简单了解vue 插值表达式Mustache
Jul 22 Javascript
vue下载二进制流图片操作
Oct 26 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
ThinkPHP关于session的操作方法汇总
2014/07/18 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
2016/03/21 PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
2016/09/30 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
Laravel5.4框架中视图共享数据的方法详解
2019/09/05 PHP
PHP实现15位身份证号转18位的方法分析
2019/10/16 PHP
Jquery CheckBox全选方法代码附js checkbox全选反选代码
2010/06/09 Javascript
JavaScript插入动态样式实现代码
2012/02/22 Javascript
JQuery中对Select的option项的添加、删除、取值
2013/08/25 Javascript
jQuery+slidereveal实现的面板滑动侧边展出效果
2015/03/14 Javascript
javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)
2016/09/20 Javascript
JS回调函数基本定义与用法实例分析
2017/05/24 Javascript
Angularjs自定义指令Directive详解
2017/05/27 Javascript
Vue.js中组件中的slot实例详解
2017/07/17 Javascript
ztree简介_动力节点Java学院整理
2017/07/19 Javascript
vue自定义全局组件(自定义插件)的用法
2018/01/30 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
2018/08/29 Javascript
uniapp开发小程序实现滑动页面控制元素的显示和隐藏效果
2020/12/10 Javascript
[02:05]2014DOTA2西雅图邀请赛 老队长全明星大猜想谁不服就按进显示器
2014/07/08 DOTA
Python实现自动登录百度空间的方法
2017/06/10 Python
详解python读取和输出到txt
2019/03/29 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
2019/08/06 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
2020/05/03 Python
完美解决jupyter由于无法import新包的问题
2020/05/26 Python
Django2.1.7 查询数据返回json格式的实现
2020/12/29 Python
使用CSS3编写类似iOS中的复选框及带开关的按钮
2016/04/11 HTML / CSS
HTML5 Canvas基本线条绘制的实例教程
2016/03/17 HTML / CSS
韩国三大免税店之一:THE GRAND 中文免税店
2016/07/21 全球购物
建筑工程毕业生自我鉴定
2014/01/14 职场文书
《童年》教学反思
2014/02/18 职场文书
学习标兵获奖感言
2014/02/20 职场文书
贷款委托书怎么写
2014/08/02 职场文书
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
2014年小学安全工作总结
2014/12/04 职场文书
公司行政管理制度范本
2015/08/05 职场文书
Python基础之进程详解
2021/05/21 Python