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"代码
Jan 09 Javascript
Extjs入门之动态加载树代码
Apr 09 Javascript
JS获取后台Cookies值的小例子
Mar 04 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
Dec 20 Javascript
jQuery制作可自定义大小的拼图游戏
Mar 30 Javascript
Javascript实现div层渐隐效果的方法
May 30 Javascript
学习javascript的闭包,原型,和匿名函数之旅
Oct 18 Javascript
详解基于Bootstrap扁平化的后台框架Ace
Nov 27 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
Nov 18 Javascript
原生js实现下拉框功能(支持键盘事件)
Jan 13 Javascript
详解如何配置vue-cli3.0的vue.config.js
Aug 23 Javascript
Vue实现渲染数据后控制滚动条位置(推荐)
Dec 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
收音机另类DIY - 纸巾盒做外壳
2021/03/02 无线电
一个简洁实用的PHP缓存类完整实例
2014/07/26 PHP
phpstorm编辑器乱码问题解决
2014/12/01 PHP
PHP实现SMTP邮件的发送实例
2018/09/27 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
JQUERY操作JSON实例代码
2010/02/09 Javascript
jQuery JSON的解析方式分享
2011/04/05 Javascript
使用jQuery或者原生js实现鼠标滚动加载页面新数据
2016/03/06 Javascript
聊一聊JavaScript作用域和作用域链
2016/05/03 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
js实现消息滚动效果
2017/01/18 Javascript
防止重复发送 Ajax 请求
2017/02/15 Javascript
canvas轨迹回放功能实现
2017/12/20 Javascript
微信小程序实现图片上传功能
2018/05/28 Javascript
vue权限管理系统的实现代码
2019/01/17 Javascript
node.js中express模块创建服务器和http模块客户端发请求
2019/03/06 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
2019/04/25 Javascript
解决vue elementUI中table里数字、字母、中文混合排序问题
2020/01/07 Javascript
vue+Element-ui实现登录注册表单
2020/11/17 Javascript
windows及linux环境下永久修改pip镜像源的方法
2016/11/28 Python
基于DATAFRAME中元素的读取与修改方法
2018/06/08 Python
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
Python从列表推导到zip()函数的5种技巧总结
2019/10/23 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
2020/06/29 Python
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
财务会计人员岗位职责
2013/11/30 职场文书
青春演讲稿范文
2014/05/08 职场文书
乡镇精神文明建设汇报材料
2014/08/15 职场文书
考试保密承诺书
2014/08/30 职场文书
判缓刑人员个人思想汇报
2014/10/10 职场文书
2015公务员试用期工作总结
2014/12/12 职场文书
2014年学生资助工作总结
2014/12/18 职场文书
护士求职简历自我评价
2015/03/10 职场文书
小学语文教师研修感悟
2015/11/18 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
MySQL 重写查询语句的三种策略
2021/05/10 MySQL