1.rest参数
ES6引入了rest参数(形式为“...变量名”),用于获取函数的多余参数,这样就不需要使用arguments对象了。rest参数搭配的变量是一个数组,该变量将多余的参数放入其中。
function add(...values) {
let sum=0;
for (let item of values){
sum+=item;
}
return sum;
}
console.log(add(2, 4, 6, 8, 10)); //控制台输出30;
以上代码中的add函数是一个求和函数,利用rest参数可以向该函数传入任意数目的参数。
rest参数中的变量代表一个数组,所以数组特有的方法都可以用于这个变量。下面是一个利用rest参数改写数组push方法的例子
function push(array,...rest) {
rest.forEach(function (value) {
array.push(value);
})
}
let a=[];
push(a,1,2,3,4,5);
console.log(a);
注意:rest参数之后不能再有其他参数(即只能是最后一个参数),否则会报错
补充:从ES5开始,函数内部可以设定为严格模式。
function doSomething(a,b) {
'use strict';
//
}
ES2016做了一点修改,规定函数参数只要使用了默认值,解构赋值或者拓展运算符,那么函数内部就不能显式设定为严格模式,否则就会报错。这样规定的原因是,函数内部的严格模式同时适用于函数体和函数参数。但是,函数执行时,先执行函数参数,然后再执行函数体。这样就有一个不合理的地方:只有从函数体之中才知道参数是否以严格模式实行,但是参数却应该先于函数体执行。有两种方法可以规避这种限制
1.设定全局性的严格模式,这是合法的
'use strict';
function doSomething(a,b=a) {
//code
}
2.把函数包在一个无参数的立即执行函数里面
const doSomething=(function () {
'use strict';
return function (value=42) {
return value;
}
}());
console.log(doSomething());; //控制台输出42
2.拓展运算符
扩展运算符( spread )是三个点(...)。它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列。
console.log(...[1, 2, 3]) //控制台输出1 2 3
console.log(1, ...[2, 3, 4], 5) //控制台输出1 2 3 4 5
如果对没有iterator接口的对象,使用扩展运算符,将会报错。
拓展运算符的一些简单应用
- 合并数组
// ES5
[1, 2].concat(more)
// ES6
[1, 2, ...more]
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' ]
- 字符串
console.log([...'hello']);
// [ "h", "e", "l", "l", "o" ]
- 实现了 Iterator 接口的对象
任何 Iterator 接口的对象,都可以用扩展运算符转为真正的数组。
例如map转为数组:
const map=new Map([
['name','张三'],
['title','Author']
])
let arr=[...map];
console.log(arr);
- 替代数组的apply方法
下面是拓展运算符取代apply方法的实际例子:应用Math.max方法简化求出一个数组中的最大元素
//ES5的写法
Math.max.apply(null,[14,3,77]);
//ES6的写法
Math.max(...[14,3,7]);
//等同于
Math.max(14,3,77);