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 相关文章推荐
js程序中美元符号$是什么
Jun 05 Javascript
JavaScript Event学习第十一章 按键的检测
Feb 10 Javascript
纯js分页代码(简洁实用)
Nov 05 Javascript
js操作css属性实现div层展开关闭效果的方法
May 11 Javascript
JavaScript中的Math.sin()方法使用详解
Jun 15 Javascript
详解AngularJS中自定义指令的使用
Jun 17 Javascript
如何用javascript计算文本框还能输入多少个字符
Jul 29 Javascript
javascript实现滚动效果的数字时钟实例
Jul 21 Javascript
jQueryUI Datepicker组件设置日期高亮
Oct 13 Javascript
JS设置随机出现2个数字的实例代码
Jul 19 Javascript
Vue组件全局注册实现警告框的实例详解
Jun 11 Javascript
javascript中的数据类型检测方法详解
Aug 07 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
详解PHP5.6.30与Apache2.4.x配置
2017/06/02 PHP
详解PHP PDO简单教程
2019/05/28 PHP
jquery中常用的SET和GET
2009/01/13 Javascript
jquery ajax学习笔记2 使用XMLHttpRequest对象的responseXML
2011/10/16 Javascript
js innerHTML 改变div内容的方法
2013/08/03 Javascript
用jquery修复在iframe下的页面锚点失效问题
2014/08/22 Javascript
jquery插件unobtrusive实现片段式加载
2015/06/15 Javascript
js实现div拖动动画运行轨迹效果代码分享
2015/08/27 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
2016/05/05 Javascript
浅谈jquery采用attr修改form表单enctype不起作用的问题
2016/11/25 Javascript
Easyui ueditor 整合解决不能编辑的问题(推荐)
2017/06/25 Javascript
细说webpack源码之compile流程-rules参数处理技巧(2)
2017/12/26 Javascript
微信小程序实现YDUI的ScrollNav组件
2018/02/02 Javascript
vue绑定的点击事件阻止冒泡的实例
2018/02/08 Javascript
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
在vue+element ui框架里实现lodash的debounce防抖
2019/11/13 Javascript
javascript实现画板功能
2020/04/12 Javascript
element 中 el-menu 组件的无限极循环思路代码详解
2020/04/26 Javascript
vue实现的多页面项目如何优化打包的步骤详解
2020/07/19 Javascript
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
2015/11/05 Python
Python Web框架Tornado运行和部署
2020/10/19 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
2017/07/13 Python
python使用PyCharm进行远程开发和调试
2017/11/02 Python
深入了解Python中pop和remove的使用方法
2018/01/09 Python
python3.4爬虫demo
2019/01/22 Python
python selenium操作cookie的实现
2020/03/18 Python
Python数据库封装实现代码示例解析
2020/09/05 Python
PyQt5的QWebEngineView使用示例
2020/10/20 Python
德国网上宠物店:Zoobio
2018/05/23 全球购物
社团成立邀请函
2014/01/08 职场文书
结婚喜宴主持词
2014/03/14 职场文书
个人欠款担保书
2014/05/20 职场文书
就业协议书
2014/09/12 职场文书
慰问信格式规范
2015/03/23 职场文书
道歉的话怎么说
2015/05/12 职场文书
微信小程序APP页面的之间的相互传递参数以及自定义组件
2022/04/19 Javascript