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操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
Jan 30 Javascript
JavaScript Event学习第二章 Event浏览器兼容性
Feb 07 Javascript
jquery 延迟执行实例介绍
Aug 20 Javascript
JQuery操作iframe父页面与子页面的元素与方法(实例讲解)
Nov 20 Javascript
JavaScript实现网页截图功能
Oct 16 Javascript
springMVC结合AjaxForm上传文件
Jul 12 Javascript
vue2.0结合Element实现select动态控制input禁用实例
May 12 Javascript
微信小程序模板(template)使用详解
Jan 31 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
Apr 22 Javascript
基于Three.js实现360度全景图片
Dec 30 Javascript
通过vue写一个瀑布流插件代码实例
Sep 07 Javascript
Vue3 中的数据侦测的实现
Oct 09 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实现选择排序的解决方法
2013/05/04 PHP
phpphp图片采集后按原路径保存图片示例
2014/02/18 PHP
php文件读取方法实例分析
2015/06/20 PHP
php读取torrent种子文件内容的方法(测试可用)
2016/05/03 PHP
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
JavaScript 编程引入命名空间的方法与代码
2007/08/13 Javascript
在IE上直接编辑网页内容的js代码(IE地址栏js)
2009/04/27 Javascript
jquery高效反选具体实现
2013/05/05 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
js面向对象的写法
2016/02/19 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
关于Vue.nextTick()的正确使用方法浅析
2017/08/25 Javascript
前端常见跨域解决方案(全)
2017/09/19 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
js简单实现自动生成表格功能示例
2020/06/02 Javascript
使用vue3重构拼图游戏的实现示例
2021/01/25 Vue.js
Python模块学习 datetime介绍
2012/08/27 Python
python中的__init__ 、__new__、__call__小结
2014/04/25 Python
Python随机生成身份证号码及校验功能
2018/12/04 Python
python实现nao机器人手臂动作控制
2019/04/29 Python
详解Python sys.argv使用方法
2019/05/10 Python
Python OrderedDict的使用案例解析
2019/10/25 Python
css3 实现滚动条美化效果的实例代码
2021/01/06 HTML / CSS
Hoka One One法国官网:美国专业跑鞋品牌
2018/12/29 全球购物
Lowe’s加拿大:家居装修、翻新和五金店
2019/12/06 全球购物
考博专家推荐信模板
2013/12/02 职场文书
毕业生自荐书模版
2014/01/04 职场文书
毕业生工作求职信
2014/06/30 职场文书
2015年党员发展工作总结
2015/05/13 职场文书
先进个人主要事迹怎么写
2015/11/04 职场文书
用人单位的规章制度,怎样制定才是有效的?
2019/07/09 职场文书
《暗黑破坏神2:重制版》本周进行第一轮A测 目前可官网进行申请报名
2021/04/07 其他游戏
详解Node.js如何处理ES6模块
2021/05/15 Javascript
MySQL 不等于的三种使用及区别
2021/06/03 MySQL