ES6中的rest参数与扩展运算符详解
前言
本文主要给大家介绍了关于ES6中rest参数与扩展运算符的相关内容,rest参数和扩展运算符都是ES6新增的特性。rest参数的形式为:...变量名;扩展运算符是三个点(...)。下面话不多说了,来一起看看详细的介绍:
rest参数
rest参数用于获取函数的多余参数,这样就不需要使用arguments对象了。rest参数搭配的变量是一个数组,该变量将多余的参数放入数组中。
functionadd(...values){ letsum=0; for(varvalofvalues){ sum+=val; } returnsum; } add(1,2,3)//6
传递给add函数的一组参数值,被整合成了数组values。
下面是一个rest参数代替arguments变量的例子。
//arguments变量的写法 functionsortNumbers(){ returnArray.prototype.slice.call(arguments).sort(); } //rest参数的写法 constsortNumbers=(...numbers)=>numbers.sort();
rest参数和arguments对象的区别
- rest参数只包含那些没有对应形参的实参;而arguments对象包含了传给函数的所有实参。
- arguments对象不是一个真实的数组;而rest参数是真实的Array实例,也就是说你能够在它上面直接使用所有的数组方法。
- arguments对象对象还有一些附加的属性(比如callee属性)。
另外,使用rest参数时应注意一下两点:
1、rest参数之后不能再有其他参数(即只能是最后一个参数),否则会报错。
functionf(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])//123 console.log(1,...[2,3,4],5)//12345
扩展运算符的应用
普通的函数调用
functionpush(array,...items){ array.push(...items); } functionadd(x,y){ returnx+y; } varnumbers=[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的写法 vararr1=[0,1,2]; vararr2=[3,4,5]; Array.prototype.push.apply(arr1,arr2); //ES6的写法 vararr1=[0,1,2]; vararr2=[3,4,5]; arr1.push(...arr2);
合并数组
vararr1=['a','b']; vararr2=['c']; vararr3=['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];//报错
将字符串转为数组
varstr='hello'; //ES5 vararr1=str.split('');//["h","e","l","l","o"] //ES6 vararr2=[...str];//["h","e","l","l","o"]
实现了Iterator接口的对象
任何Iterator接口的对象,都可以用扩展运算符转为真正的数组。
varnodeList=document.querySelectorAll('div'); vararray=[...nodeList];
上面代码中,querySelectorAll方法返回的是一个nodeList对象。它不是数组,而是一个类似数组的对象。这时,扩展运算符可以将其转为真正的数组,原因就在于NodeList对象实现了Iterator。
总结
从上面的例子可以看出,rest参数使用场景应该稍少一些,主要是处理不定数量参数,可以避免arguments对象的使用。而扩展运算符的应用就比较广了,在实际项目中灵活应用,能写出更精简的代码。
好了,以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。