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筛选器children()案例详解(图文)
Feb 17 Javascript
JS定时关闭窗口的实例
May 22 Javascript
jQuery绑定事件不执行但alert后可以正常执行
Jun 03 Javascript
jquery和css3实现的炫酷时尚的菜单导航
Sep 01 Javascript
使用mini-define实现前端代码的模块化管理
Dec 25 Javascript
js中函数声明与函数表达式
Jun 03 Javascript
Jquery实现简单的轮播效果(代码管用)
Mar 14 Javascript
实现图片首尾平滑轮播(JS原生方法—节流)
Oct 17 Javascript
Node.JS循环删除非空文件夹及子目录下的所有文件
Mar 12 Javascript
详解vuex commit保存数据技巧
Dec 25 Javascript
Vue CL3 配置路径别名详解
May 30 Javascript
Vue实现手机扫描二维码预览页面效果
May 28 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模板比较标签用法详解
2014/06/30 PHP
PHP中数据类型转换的三种方式
2015/04/02 PHP
PHP自定义函数实现数组比较功能示例
2017/10/19 PHP
PHP 对象接口简单实现方法示例
2020/04/13 PHP
理解Javascript_08_函数对象
2010/10/15 Javascript
Javascript+CSS实现影像卷帘效果思路及代码
2014/10/20 Javascript
Javascript实现飞动广告效果的方法
2015/05/25 Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
2015/12/15 Javascript
jquery select2的使用心得(推荐)
2016/12/04 Javascript
jquery实现简单实用的轮播器
2017/05/23 jQuery
JavaScript中使用Async实现异步控制
2017/08/15 Javascript
利用10行js代码实现上下滚动公告效果
2017/12/08 Javascript
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
jQuery中使用validate插件校验表单功能
2019/05/24 jQuery
JavaScript使用百度ECharts插件绘制饼图操作示例
2019/11/26 Javascript
Vue关于组件化开发知识点详解
2020/05/13 Javascript
使用Python标准库中的wave模块绘制乐谱的简单教程
2015/03/30 Python
Python的Django框架中使用SQLAlchemy操作数据库的教程
2016/06/02 Python
python中实现将多个print输出合成一个数组
2018/04/19 Python
django如何通过类视图使用装饰器
2019/07/24 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
2020/05/26 Python
利用Python发送邮件或发带附件的邮件
2020/11/12 Python
python绘制高斯曲线
2021/02/19 Python
利用CSS3实现折角效果实例源码
2016/09/28 HTML / CSS
canvas绘制图片drawImage使用方法
2020/09/15 HTML / CSS
复古风格的女装和装饰品:ModCloth
2017/12/29 全球购物
捷克汽车配件和工具销售网站:TorriaCars
2018/02/26 全球购物
英国领先的品牌珠宝和配件供应商:Acotis Jewellery
2018/03/07 全球购物
PHP解析URL是哪个函数?怎么用?
2013/05/09 面试题
证婚人经典证婚词
2014/01/09 职场文书
财务担保书范文
2014/04/02 职场文书
通信工程求职信
2014/07/16 职场文书
学习党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
学生逃课检讨书1000字
2014/10/20 职场文书
民主生活会汇报材料
2014/12/15 职场文书
2015教师个人年度工作总结
2015/10/23 职场文书