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 Tips(3) 关于$()包装集内元素的改变
Dec 14 Javascript
Jquery实现侧边栏跟随滚动条固定(兼容IE6)
Apr 02 Javascript
jquery通过select列表选择框对表格数据进行过滤示例
May 07 Javascript
JavaScript 基本概念
Jan 20 Javascript
学习JavaScript事件流和事件处理程序
Jan 25 Javascript
基于javascript的Form表单验证
Dec 29 Javascript
详谈JavaScript的闭包及应用
Jan 17 Javascript
jQuery is not defined 错误原因与解决方法小结
Mar 19 Javascript
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
Sep 05 Javascript
jQuery三组基本动画与自定义动画操作实例总结
May 09 jQuery
Vue router安装及使用方法解析
Dec 02 Vue.js
详解Vue3.0 + TypeScript + Vite初体验
Feb 22 Vue.js
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
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 define函数的使用说明
2008/08/27 PHP
PHP翻页跳转功能实现方法
2020/11/30 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
2016/04/07 PHP
JQuery下的Live方法和$.browser方法使用代码
2010/06/02 Javascript
jQuery dialog 异步调用ashx,webservice数据的代码
2010/08/03 Javascript
jquerymobile局部渲染的各种刷新方法小结
2014/03/05 Javascript
jQuery插件Zclip实现完美兼容个浏览器点击复制内容到剪贴板
2015/04/30 Javascript
jquery中添加属性和删除属性
2015/06/03 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
浅析JavaScript中break、continue和return的区别
2016/11/30 Javascript
Javascript 制作图形验证码实例详解
2016/12/22 Javascript
Three.js获取鼠标点击的三维坐标示例代码
2017/03/24 Javascript
详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
2017/08/09 jQuery
JS中数组与对象的遍历方法实例小结
2018/08/14 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
详解Vue CLI 3.0脚手架如何mock数据
2018/11/23 Javascript
关于angular 8.1使用过程中的一些记录
2020/11/25 Javascript
Python模拟登录验证码(代码简单)
2016/02/06 Python
pandas删除行删除列增加行增加列的实现
2019/07/06 Python
Python 使用type来定义类的实现
2019/11/19 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
matlab灰度图像调整及imadjust函数的用法详解
2020/02/27 Python
HTML5 新旧语法标记对我们有什么好处
2012/12/13 HTML / CSS
html5的canvas元素使用方法介绍(画矩形、画折线、圆形)
2014/04/14 HTML / CSS
深入理解HTML的FormData对象
2016/05/17 HTML / CSS
百思买美国官网:Best Buy
2016/07/28 全球购物
意大利会呼吸的鞋:Geox健乐士
2017/02/12 全球购物
兰蔻法国官方网站:Lancôme法国
2020/02/22 全球购物
网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?
2016/03/27 面试题
小学生自我鉴定
2013/10/12 职场文书
共产党员公开承诺书
2014/03/25 职场文书
高三上学期学习自我评价
2014/04/23 职场文书
个人租房协议书范本
2014/09/30 职场文书
农村党建工作汇报材料
2014/10/27 职场文书
学术会议邀请函
2015/01/30 职场文书