本文适合JavaScript初学者阅读前端
以前这篇文章JavaScript展开操做符(Spread operator)介绍讲解过展开操做符。剩余操做符和展开操做符的表示方式同样,都是三个点 '…',可是他们的使用场景会不一样。程序员
定义函数的时候,若是函数的参数以… 为前缀,则改参数是剩余参数(rest parameter)。剩余参数表示参数个数不肯定的参数列表。在函数被调用时,该形参会成为一个数组,数组中的元素都是传递给该函数的多出来的实参的值。编程
剩余操做符能够用来方便地获取传进来的参数。数组
function sum(a,b,...args){ console.log(args.length); // 传进来的参数的个数 3 let s = a + b; if(args && args.length){ args.forEach(i => {s += i}); } return s;}sum(1, 2, 3, 4, 5 ); // 传进来的参数的个数 3复制代码
其中第一个形参a对应的是1,第二个形参b对应的2,…args表示的就是[3, 4, 5]。bash
上面剩余参数args是一个数组,而函数的arguments是一个伪数组。应此剩余参数可使用数组的相关方法sort,map,forEach,pop,而arguments不能。架构
arguments想要变成数组,能够经过Array.prototype.slice.call方法,使用剩余操做符能够避免将arguments转为数组的麻烦。函数
// 下面的代码模拟了剩余数组function sum(a,b,){ var args = Array.prototype.slice.call(arguments, sum.length); console.log(args.length); // 传进来的参数的个数 3 let s = a + b; args.forEach(i => {s += i}); return s;}sum(1, 2, 3, 4, 5 );复制代码
而使用剩余操做符,则不须要转化,直接使用,更加方便。ui
咱们知道,ES6 容许按照必定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。 好比以下代码:职业规划
let array = [1,2,3]let [a,b,c] = array; // a 1, b 2, c 3复制代码
再好比以下代码:spa
let obj = {a:1,b:2,c:3}let {a,b,c} = obj; // a 1, b 2, c 3复制代码
在解构赋值时,可使用剩余操做符。剩余操做符所操做的变量会匹配在解构赋值中全部其余变量未匹配到的属性。
好比以下代码,others会匹配到first和second对于属性的余下的属性:
const { first, second, ...others } = { first: 1, second: 2, third: 3, fourth: 4, fifth: 5}first // 1second // 2others // { third: 3, fourth: 4, fifth: 5 }复制代码
对象中余下的属性值被打包起来构造一个新的对象赋值给了others
。
数组也能够经过剩余操做符,把剩余的元素打包成一个新的数组赋值给剩余属性,代码以下:
let array = [1,2,3,4,5];let [a,b,...c] = array; // a 1,b 2, c [3,4,5]复制代码
某种程度上,能够任务剩余操做符是展开操做符的相反操做。展开操做符会”展开“数组编程多个元素,剩余操做符会把多个元素压缩成一个单一的元素。
欢迎关注公众号“ITman彪叔”。彪叔,拥有10多年开发经验,现任公司系统架构师、技术总监、技术培训师、职业规划师。熟悉Java、JavaScript。在计算机图形学、WebGL、前端可视化方面有深刻研究。对程序员思惟能力训练和培训、程序员职业规划和程序员理财投资有浓厚兴趣。