ES6中的rest参数与扩展运算符详解


Posted in Javascript onJuly 18, 2017

前言

本文主要给大家介绍了关于ES6中rest参数与扩展运算符的相关内容,rest参数和扩展运算符都是ES6新增的特性。rest参数的形式为:...变量名;扩展运算符是三个点(...)。下面话不多说了,来一起看看详细的介绍:

rest参数

rest参数用于获取函数的多余参数,这样就不需要使用arguments对象了。rest参数搭配的变量是一个数组,该变量将多余的参数放入数组中。

function add(...values) {
 let sum = 0;
 for (var val of values) {
 sum += val;
 }
 return sum;
}

add(1, 2, 3) // 6

传递给 add 函数的一组参数值,被整合成了数组 values。

下面是一个 rest 参数代替arguments变量的例子。

// arguments变量的写法
function sortNumbers() {
 return Array.prototype.slice.call(arguments).sort();
}

// rest参数的写法
const sortNumbers = (...numbers) => numbers.sort();

rest参数和arguments对象的区别

  • rest参数只包含那些没有对应形参的实参;而 arguments 对象包含了传给函数的所有实参。
  • arguments 对象不是一个真实的数组;而rest参数是真实的 Array 实例,也就是说你能够在它上面直接使用所有的数组方法。
  • arguments 对象对象还有一些附加的属性 (比如callee属性)。

另外,使用rest参数时应注意一下两点:

1、rest 参数之后不能再有其他参数(即只能是最后一个参数),否则会报错。

function f(a, ...b, c) { ... } // 报错

2、函数的length属性,不包括 rest 参数。

(function(a) {}).length // 1
(function(...a) {}).length // 0
(function(a, ...b) {}).length // 1

扩展运算符

扩展运算符可以看做是 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列。

console.log(...[1, 2, 3]) // 1 2 3

console.log(1, ...[2, 3, 4], 5) //1 2 3 4 5

扩展运算符的应用

普通的函数调用

function push(array, ...items) {
 array.push(...items);
}

function add(x, y) {
 return x + y;
}

var numbers = [4, 38];
add(...numbers) // 42

上面代码中,array.push(...items)add(...numbers)这两行,都是函数的调用,它们的都使用了扩展运算符。该运算符将一个数组,变为参数序列。

替代 apply 方法调用函数

// ES5 的写法
Math.max.apply(null, [14, 3, 77])

// ES6 的写法
Math.max(...[14, 3, 77])

// 等同于
Math.max(14, 3, 77);
// ES5 的写法
var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
Array.prototype.push.apply(arr1, arr2);

// ES6 的写法
var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
arr1.push(...arr2);

合并数组

var arr1 = ['a', 'b'];
var arr2 = ['c'];
var arr3 = ['d', 'e'];

// ES5的合并数组
arr1.concat(arr2, arr3) // [ 'a', 'b', 'c', 'd', 'e' ]

// ES6的合并数组
[...arr1, ...arr2, ...arr3] // [ 'a', 'b', 'c', 'd', 'e' ]

与解构赋值结合

const [first, ...rest] = [1, 2, 3, 4, 5];
first // 1
rest // [2, 3, 4, 5]

const [first, ...rest] = [];
first // undefined
rest // []

const [first, ...rest] = ["foo"];
first // "foo"
rest // []

如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错。

const [...butLast, last] = [1, 2, 3, 4, 5]; // 报错

const [first, ...middle, last] = [1, 2, 3, 4, 5]; // 报错

将字符串转为数组

var str = 'hello';

// ES5 
var arr1 = str.split(''); // [ "h", "e", "l", "l", "o" ] 

// ES6 
var arr2 = [...str]; // [ "h", "e", "l", "l", "o" ]

实现了 Iterator 接口的对象

任何 Iterator 接口的对象,都可以用扩展运算符转为真正的数组。

var nodeList = document.querySelectorAll('div');
var array = [...nodeList];

上面代码中,querySelectorAll方法返回的是一个nodeList对象。它不是数组,而是一个类似数组的对象。这时,扩展运算符可以将其转为真正的数组,原因就在于NodeList对象实现了 Iterator 。

总结

从上面的例子可以看出,rest参数使用场景应该稍少一些,主要是处理不定数量参数,可以避免arguments对象的使用。而扩展运算符的应用就比较广了,在实际项目中灵活应用,能写出更精简的代码。

好了,以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JQuery文字列表向上滚动的代码
Nov 13 Javascript
JsRender for index循环索引用法详解
Oct 31 Javascript
node.js中的url.resolve方法使用说明
Dec 10 Javascript
IE8下jQuery改变png图片透明度时出现的黑边
Aug 30 Javascript
JavaScript中点击事件的写法
Jun 28 Javascript
jquery判断页面网址是否有效的两种方法
Dec 11 Javascript
vue 打包后的文件部署到express服务器上的方法
Aug 09 Javascript
JavaScript内存泄漏的处理方式
Nov 20 Javascript
Angular利用trackBy提升性能的方法
Jan 26 Javascript
layerUI下的绑定事件实例代码
Aug 17 Javascript
跨域请求两种方法 jsonp和cors的实现
Nov 11 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
Oct 09 Javascript
ES6学习之变量的两种命名方法示例
Jul 18 #Javascript
vue实现表格增删改查效果的实例代码
Jul 18 #Javascript
js canvas实现适用于移动端的百分比仪表盘dashboard
Jul 18 #Javascript
vue深入解析之render function code详解
Jul 18 #Javascript
jquery插件canvaspercent.js实现百分比圆饼效果
Jul 18 #jQuery
浅谈JS封闭函数、闭包、内置对象
Jul 18 #Javascript
iscroll实现下拉刷新功能
Jul 18 #Javascript
You might like
用PHP+MySql编写聊天室
2006/10/09 PHP
php 使用array函数实现分页
2015/02/13 PHP
实例讲解PHP表单
2020/06/10 PHP
动态的绑定事件addEventListener方法的使用
2014/01/24 Javascript
jQuery中阻止冒泡事件的方法介绍
2014/04/12 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
Jquery跨域获得Json的简单实例
2016/05/18 Javascript
js获取form表单所有数据的简单方法
2016/08/18 Javascript
Vuejs第十一篇组件之slot内容分发实例详解
2016/09/09 Javascript
简单谈谈ES6的六个小特性
2016/11/18 Javascript
详解webpack与SPA实践之开发环境搭建
2017/12/18 Javascript
webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)
2018/01/09 Javascript
微信小程序实现日历效果
2018/12/28 Javascript
详解javascript设计模式三:代理模式
2019/03/25 Javascript
Vue开发环境中修改端口号的实现方法
2019/08/15 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
2020/12/01 Vue.js
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
[38:44]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第二局
2016/02/25 DOTA
[02:11]2016国际邀请赛中国区预选赛最美TA采访现场玩家
2016/06/28 DOTA
Python 数据结构之队列的实现
2017/01/22 Python
Django框架的中的setting.py文件说明详解
2018/10/15 Python
使用Py2Exe for Python3创建自己的exe程序示例
2018/10/31 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
2019/03/18 Python
Python re 模块findall() 函数返回值展现方式解析
2019/08/09 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
2019/09/05 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
Html5实现二维码扫描并解析
2016/01/20 HTML / CSS
中英双版中文教师求职信
2013/10/27 职场文书
单位办理社保介绍信
2014/01/10 职场文书
产品设计开发计划书
2014/05/07 职场文书
人事任命书范本
2015/09/21 职场文书
2015年终个人政治思想工作总结
2015/11/24 职场文书
党员心得体会范文2016
2016/01/23 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书
零基础学java之带参数以及返回值的方法
2022/04/10 Java/Android