剩余参数和扩展操作符是ES6的新特性。其余参数的形式为:...变量名;扩展运算符是三个点(...)。rest参数rest参数用于获取函数的冗余参数,这样就不需要使用arguments对象了。带rest参数的变量是一个数组,变量把多余的参数放到数组中。函数添加(...值){让总和=0;for(varvalofvalues){sum+=val;}returnsum;}add(1,2,3)//一组6个传递给add函数的参数值被整合到数组值中。下面是rest参数而不是arguments变量的示例。//参数变量的写法functionsortNumbers(){returnArray.prototype.slice.call(arguments).sort();}//剩余参数的写法constsortNumbers=(...numbers)=>numbers.sort();rest参数和arguments对象的区别rest参数只包含那些没有对应形参的实参;而arguments对象包含传递给函数的所有实际参数。arguments对象不是真正的数组;rest参数是一个真正的Array实例,这意味着您可以直接在其上使用所有数组方法。argumentsobject对象还有一些额外的属性(比如callee属性)。另外,在使用rest参数时要注意两点:rest参数后面不能有其他参数(即只能是最后一个参数),否则会报错。functionf(a,...b,c){...}//报错函数的长度属性,不包括rest参数。(function(a){}).length//1(function(...a){}).length//0(function(a,...b){}).length//1个展开运算符展开运算符可以看成是rest参数的逆运算,将一个数组转化为以逗号分隔的参数序列。console.log(...[1,2,3])//123console.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//1rest//[2,3,4,5]const[first,...rest]=[];first//undefinedrest//[]const[first,...rest]=["foo"];first//"foo"rest//[]如果运算符将被扩展字符用于数组赋值,只能放在参数的最后一位,否则会报错。const[...butLast,last]=[1,2,3,4,5];//错误const[first,...middle,last]=[1,2,3,4,5];//报错convertstringtoarrayvarstr='hello';//ES5vararr1=str.split('');//["h","e","l","l","o"]//ES6vararr2=[...str];//["h","e","l","l","o"]实现Iterator接口的对象Iterator接口的任何对象,都可以用扩展运算符转换为真正的数组。varnodeList=document.querySelectorAll('div');vararray=[...nodeList];在上面的代码中,querySelectorAll方法返回一个nodeList对象。它不是一个数组,而是一个类似数组的对象。这时候扩展运算符就可以将其转化为真正的数组,因为NodeList对象实现了Iterator。总结从上面的例子我们可以看出,rest参数的使用要稍微少一些,主要是处理不定数量的参数,可以避免使用argumentsobject。扩展运算符的应用比较广泛,在实际项目中可以灵活运用,写出更加精简的代码。
