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 相关文章推荐
javascript Xml增删改查(IE下)操作实现代码
Jan 30 Javascript
JavaScript面向对象之静态与非静态类
Feb 03 Javascript
document.getElementById介绍
Sep 13 Javascript
JS在一定时间内跳转页面及各种刷新页面的实现方法
May 26 Javascript
JavaScript中两个字符串的匹配
Jun 08 Javascript
Bootstrap基本样式学习笔记之标签(5)
Dec 07 Javascript
关于 angularJS的一些用法
Nov 29 Javascript
浅谈Vue路由快照实现思路及其问题
Jun 07 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
Jun 14 Javascript
如何手动实现一个 JavaScript 模块执行器
Oct 16 Javascript
详解Vue中的自定义指令
Dec 07 Vue.js
如何使用CocosCreator对象池
Apr 14 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的无限分类实现想法~
2007/01/02 PHP
php 清除网页病毒的方法
2008/12/05 PHP
PHP漏洞全解(详细介绍)
2012/11/13 PHP
php 启动时报错的简单解决方法
2014/01/27 PHP
php微信公众号开发(3)php实现简单微信文本通讯
2016/12/15 PHP
php函数式编程简单示例
2019/08/08 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
2020/04/06 PHP
Nginx+php配置文件及原理解析
2020/12/09 PHP
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
前端开发过程中浏览器版本的两种判定方法
2013/10/30 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
2014/04/08 Javascript
javascript的document.referrer浏览器支持、失效情况总结
2014/07/18 Javascript
提升PHP安全:8个必须修改的PHP默认配置
2014/11/17 Javascript
学习JavaScript设计模式之观察者模式
2020/04/22 Javascript
javascript使用Promise对象实现异步编程
2016/03/01 Javascript
详解JavaScript的另类写法
2016/04/11 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
2016/06/13 Javascript
用原生js统计文本行数的简单示例
2016/08/19 Javascript
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
Vue单页及多页应用全局配置404页面实践记录
2018/05/22 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
2020/04/16 Javascript
[57:18]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#3VP VS VG
2016/03/03 DOTA
[00:12]DAC SOLO赛卫冕冠军 VG.Paparazi灬展现SOLO技巧
2018/04/06 DOTA
在Gnumeric下使用Python脚本操作表格的教程
2015/04/14 Python
详解Python函数作用域的LEGB顺序
2016/05/14 Python
使用Python获取网段IP个数以及地址清单的方法
2018/11/01 Python
python英语单词测试小程序代码实例
2019/09/09 Python
Python自带的IDE在哪里
2020/07/01 Python
你正在寻找的CSS3 动画技术
2011/07/27 HTML / CSS
毕业生就业推荐信范文
2013/12/01 职场文书
实习生工作证明范本
2014/09/14 职场文书
医院保洁员管理制度
2015/08/05 职场文书
护士业务学习心得体会
2016/01/25 职场文书
SqlServer: 如何更改表的文件组?(进而改变存储位置)
2021/04/05 SQL Server
详解解Django 多对多表关系的三种创建方式
2021/08/23 Python
动画《朋友游戏》公开佐藤友生绘制的开播纪念绘
2022/04/06 日漫