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和s3captche实现一个水果名字的验证
Aug 14 Javascript
js 链式延迟执行DOME
Jan 04 Javascript
JS扩展方法实例分析
Apr 15 Javascript
JS+CSS实现仿msn风格选项卡效果代码
Oct 22 Javascript
深入理解MVC中的时间js格式化
May 19 Javascript
Ionic如何创建APP项目
Jun 03 Javascript
微信小程序 122100版本更新问题解决方案
Dec 22 Javascript
利用 spin.js 生成等待效果(js 等待效果)
Jun 25 Javascript
vue 运用mock数据的示例代码
Nov 07 Javascript
微信 jssdk 签名错误invalid signature的解决方法
Jan 14 Javascript
在weex中愉快的使用scss的方法步骤
Jan 02 Javascript
js实现div色块拖动录制
Jan 16 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
关于shopex同步ucenter的redirect问题,导致script不运行
2013/04/10 PHP
PHP上传图片类显示缩略图功能
2016/06/30 PHP
PHP批斗大会之缺失的异常详解
2019/07/09 PHP
document.getElementById介绍
2011/09/13 Javascript
JavaScript中检测变量是否存在遇到的一些问题
2013/11/11 Javascript
利用进制转换压缩数字函数分享
2014/01/02 Javascript
谈一谈jQuery核心架构设计
2016/03/28 Javascript
nodejs批量下载图片的实现方法
2017/05/19 NodeJs
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
2017/05/26 jQuery
JavaScript实现动态添加Form表单元素的方法示例
2017/08/14 Javascript
详解node单线程实现高并发原理与node异步I/O
2017/09/21 Javascript
Vue iview-admin框架二级菜单改为三级菜单的方法
2018/07/03 Javascript
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
关于vue-cli3打包代码后白屏的解决方案
2020/09/02 Javascript
原生js实现移动小球(碰撞检测)
2020/12/17 Javascript
Python性能优化技巧
2015/03/09 Python
在Python中处理列表之reverse()方法的使用教程
2015/05/21 Python
Python Requests安装与简单运用
2016/04/07 Python
Python数组遍历的简单实现方法小结
2016/04/27 Python
Python实现控制台中的进度条功能代码
2017/12/22 Python
python实现飞机大战
2018/09/11 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
python3-flask-3将信息写入日志的实操方法
2019/11/12 Python
学python最电脑配置有要求么
2020/07/05 Python
使用python求斐波那契数列中第n个数的值示例代码
2020/07/26 Python
建龙钢铁面试总结
2014/04/15 面试题
应届生自荐信范文
2014/02/21 职场文书
副总经理岗位职责
2014/03/16 职场文书
无私奉献演讲稿
2014/09/04 职场文书
承兑汇票转让证明怎么写?
2014/11/30 职场文书
敬业奉献模范事迹材料
2014/12/24 职场文书
致运动员的广播稿
2015/08/19 职场文书
2016应届毕业生就业指导课心得体会
2016/01/15 职场文书
医德医风学习心得体会
2016/01/25 职场文书
在K8s上部署Redis集群的方法步骤
2021/04/27 Redis
使用CSS设置滚动条样式
2022/01/18 HTML / CSS