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弹窗代码 可以指定弹出间隔
Jul 03 Javascript
原创javascript小游戏实现代码
Aug 19 Javascript
用javascript对一个json数组深度赋值示例
Jul 27 Javascript
Javascript表单验证要注意的事项
Sep 29 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
Jan 26 Javascript
值得分享和收藏的Bootstrap学习教程
May 12 Javascript
使用jQuery判断浏览器滚动条位置的方法
May 30 Javascript
JS排序之选择排序详解
Apr 08 Javascript
基于webpack4搭建的react项目框架的方法
Jun 30 Javascript
node.js中express模块创建服务器和http模块客户端发请求
Mar 06 Javascript
详解Vue中的基本语法和常用指令
Jul 23 Javascript
浅谈es6中的元编程
Dec 01 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 程式大小
2006/12/06 PHP
php实现简单文件下载的方法
2015/01/30 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
详解cookie验证的php应用的一种SSO解决办法
2017/10/20 PHP
phpMyAdmin通过密码漏洞留后门文件
2018/11/20 PHP
JavaScript 对象的属性和方法4种不同的类型
2010/03/19 Javascript
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
使用vue编写一个点击数字计时小游戏
2016/08/31 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
ionic中列表项增加和删除的实现方法
2017/01/22 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
解决bootstrap下拉菜单点击立即隐藏bug的方法
2017/06/13 Javascript
基于JavaScript实现无缝滚动效果
2017/07/21 Javascript
vue组件的写法汇总
2018/04/12 Javascript
angular ng-model 无法获取值的处理方法
2018/10/02 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
2018/10/12 Javascript
jQuery实现获取当前鼠标位置并输出功能示例
2019/01/05 jQuery
微信小程序使用wx.request请求服务器json数据并渲染到页面操作示例
2019/03/30 Javascript
vue子传父关于.sync与$emit的实现
2019/11/05 Javascript
jQuery带控制按钮轮播图插件
2020/07/31 jQuery
[59:00]OG vs TNC 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python实现从URL地址提取文件名的方法
2015/05/15 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
详解使用python绘制混淆矩阵(confusion_matrix)
2019/07/14 Python
Flask框架路由和视图用法实例分析
2019/11/07 Python
DJango的创建和使用详解(默认数据库sqlite3)
2019/11/18 Python
使用python 计算百分位数实现数据分箱代码
2020/03/03 Python
pycharm如何设置官方中文(如何汉化)
2020/12/29 Python
idealfit英国:世界领先的女性健身用品和运动衣物品牌
2017/11/25 全球购物
校园报刊亭的创业计划书
2014/01/02 职场文书
军人违纪检讨书
2014/02/04 职场文书
初三学生个人自我评定
2014/04/06 职场文书
节能标语大全
2014/06/21 职场文书
档案工作个人总结
2015/03/03 职场文书
2016年大学生实习单位评语
2015/12/01 职场文书