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 相关文章推荐
ASP.NET jQuery 实例6 (实现CheckBoxList成员全选或全取消)
Jan 13 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
Jan 13 Javascript
JavaScript中匿名、命名函数的性能测试
Sep 04 Javascript
jquery实现点击label的同时触发文本框点击事件的方法
Jun 05 Javascript
如何利用JQuery实现从底部回到顶部的功能
Dec 27 Javascript
Webpack打包慢问题的完美解决方法
Mar 16 Javascript
JS鼠标滚动分页效果示例
Jul 05 Javascript
jquery之基本选择器practice(实例讲解)
Sep 30 jQuery
JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
Mar 10 Javascript
如何在vue里添加好看的lottie动画
Aug 02 Javascript
JS实现的RC4加密算法示例
Aug 16 Javascript
vue实现多个元素或多个组件之间动画效果
Sep 25 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
了解咖啡雨林联盟认证 什么是雨林认证 雨林认证是什么意思
2021/03/05 新手入门
深入php list()函数的详解
2013/06/05 PHP
PHP获取当前页面完整URL的实现代码
2013/06/10 PHP
php通过记录IP来防止表单重复提交方法分析
2014/12/16 PHP
php正则表达式学习笔记
2015/11/13 PHP
浅析php中array_map和array_walk的使用对比
2016/11/20 PHP
JavaScript学习点滴 call、apply的区别
2010/10/22 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
第一次接触神奇的Bootstrap菜单和导航
2016/08/01 Javascript
jQuery Mobile和HTML5开发App推广注册页
2016/11/07 Javascript
jQuery居中元素scrollleft计算方法示例
2017/01/16 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
如何在 Vue.js 中使用第三方js库
2017/04/25 Javascript
js字符串处理之绝妙的代码
2019/04/05 Javascript
[19:59]2014DOTA2国际邀请赛 IG战队纪录片
2014/08/07 DOTA
[02:38]2018年度DOTA2最佳劣单位选手-完美盛典
2018/12/17 DOTA
python中精确输出JSON浮点数的方法
2014/04/18 Python
Python实现删除Android工程中的冗余字符串
2015/01/19 Python
Python二叉搜索树与双向链表转换实现方法
2016/04/29 Python
利用python获取某年中每个月的第一天和最后一天
2016/12/15 Python
Python实现爬虫从网络上下载文档的实例代码
2018/06/13 Python
python使用celery实现异步任务执行的例子
2019/08/28 Python
使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能
2019/12/12 Python
TensorFlow内存管理bfc算法实例
2020/02/03 Python
python生成大写32位uuid代码
2020/03/03 Python
解决python3.x安装numpy成功但import出错的问题
2020/11/17 Python
详解CSS3 rem(设置字体大小) 教程
2017/11/21 HTML / CSS
使用分层画布来优化HTML5渲染的教程
2015/05/08 HTML / CSS
详解如何解决使用JSON.stringify时遇到的循环引用问题
2021/03/23 Javascript
酒店服务与管理毕业生求职信
2013/11/02 职场文书
人力资源部副职的竞聘演讲稿
2014/01/07 职场文书
促销活动策划方案
2014/01/12 职场文书
《问银河》教学反思
2014/02/19 职场文书
领导失职检讨书
2014/02/24 职场文书
教师批评与自我批评心得体会
2014/10/16 职场文书
HTML5基础学习之文本标签控制
2022/03/25 HTML / CSS