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 setTimeout 参数传递使用介绍
Aug 13 Javascript
含有CKEditor的表单如何提交
Jan 09 Javascript
jquery获取元素索引值index()示例
Feb 13 Javascript
jquery控制display属性为none或block
Mar 31 Javascript
json定义及jquery操作json的方法
Sep 29 Javascript
Angular2 之 路由与导航详细介绍
May 26 Javascript
JS判断数组那点事
Oct 10 Javascript
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
Sep 11 Javascript
小程序实现列表删除功能
Oct 30 Javascript
JavaScript浅层克隆与深度克隆示例详解
Sep 01 Javascript
JavaScript实现网页tab栏效果制作
Nov 20 Javascript
Vue Element UI自定义描述列表组件
May 18 Vue.js
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上传文件问题汇总
2015/01/30 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
2018/03/12 PHP
Code: write(s,d) 输出连续字符串
2007/08/19 Javascript
setTimeout 不断吐食CPU的问题分析
2009/04/01 Javascript
下拉列表select 由左边框移动到右边示例
2013/12/04 Javascript
jQuery操作JSON的CRUD用法实例
2015/02/25 Javascript
Bootstrap模态框禁用空白处点击关闭
2016/10/20 Javascript
javascript鼠标跟随运动3种效果(眼球效果,苹果菜单,方向跟随)
2016/10/27 Javascript
设置cookie指定时间失效(实例代码)
2017/05/28 Javascript
JavaScript箭头(arrow)函数详解
2017/06/04 Javascript
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
为python设置socket代理的方法
2015/01/14 Python
使用Python3中的gettext模块翻译Python源码以支持多语言
2015/03/31 Python
详解python3中zipfile模块用法
2018/06/18 Python
Python  unittest单元测试框架的使用
2018/09/08 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
2019/01/29 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
python 多进程共享全局变量之Manager()详解
2019/08/15 Python
python3中的eval和exec的区别与联系
2019/10/10 Python
python+selenium+Chrome options参数的使用
2020/03/18 Python
如何在python中执行另一个py文件
2020/04/30 Python
python Autopep8实现按PEP8风格自动排版Python代码
2021/03/02 Python
纯css3实现照片墙效果
2014/12/26 HTML / CSS
html5图片上传预览示例分享
2014/04/14 HTML / CSS
澳洲本土太阳镜品牌:Quay Australia
2019/07/29 全球购物
2013年办公室秘书的个人自我鉴定
2013/10/24 职场文书
物流毕业生个人的自我评价
2014/02/13 职场文书
正风肃纪剖析材料
2014/02/18 职场文书
总经理助理岗位职责范本
2014/07/20 职场文书
新闻专业毕业生求职信
2014/08/08 职场文书
学校政风行风整改方案
2014/10/25 职场文书
公积金具结保证书
2015/05/11 职场文书
春季运动会加油词
2015/07/18 职场文书
优秀新员工事迹材料
2019/05/13 职场文书
Java基础之this关键字的使用
2021/06/30 Java/Android
怎么禁用Win11输入法 最新Win11输入法关闭教程
2022/08/05 数码科技