1. 基本写法
在es6中,给函数参数赋默认值有了简单写法:
function fn(x=1, y=7, z=42){
return x + y + z;
}
fn();//50
fn(2);//51
在未传参数时,x,y,z默认使用1, 7, 42,当传入参数时,就使用传入的参数,
就完成了给函数赋默认值的作用。
此外还有一种写法:
function fn(x=1, y=x + 7, z=42){
return x + y + z;
}
fn(1);//51 = 1 + (1+7) + 42
注意,这种写法是有要求的,只能后面引用前面,即 y = x + 1; z = x + y ;不能写x = y+ z这种,不然会报
" y(z) is not defined"错误。
2. 参数检查
function fnCheck(){
throw new Error('can\'t be empty');
}
function fn(x=fnCheck(), y=7, z=42){
return x+y+z;
}
fn(1);//50 = 1+7+42
fn();// can't be empty
try{
fn();
} catch (e){
console.log(e);//can't be empty
} finally{
}
解释:执行fn(),因为没有赋值,所以执行默认参数x=fnCheck(),那就执行了 throw new Error('can\'t be empty');
3. 可变参数处理
因为js函数的特殊性,调用函数的时候传的参数是没有严格限制的,比如:
fn(){
//函数体语句
};
然后:fn(1,2,3);
fn(1,2,3,4);
用户调用fn可能会传入不同个数的参数,我们要想获取这些参数,在ES5的时候要这样:
先说明一下MDN对arguments的描述:
“arguments
对象是所有(非箭头)函数中都可用的局部变量。你可以使用arguments
对象在函数中引用函数的参数。此对象包含传递给函数的每个参数的条目,第一个条目的索引从0开始。
arguments
对象不是一个 Array
。它类似于Array
,但除了length属性和索引元素之外没有任何Array
属性。例如,它没有 pop 方法。但是它可以被转换为一个真正的Array
:
var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);
// ES2015
const args = Array.from(arguments);
3.1 ES5中,我们可以这样写fn:
function fn(){
var a = Array.prototype.slice.call(arguments);//或者 var a= Array.from(arguments);
var sum= 0;
a .forEach(function(item){
sum += item;
})
return sum;
};
fn(1,2,3);//6
fn(1,2,3,4);//10
说白了arguments就是js送给我们的参数,指的就是引用函数时传入的参数,和this啥的一样,不用自己定义就能拿来用,都提前被js定义好了的。
另外,也可以用箭头函数改写一下,注意,arguments
对象是所有(非箭头)函数中都可用的
局部变量,这里我们用在a.forEach()上面:
function fn(){
var a = Array.prototype.slice.call(arguments);//或者 var a= Array.from(arguments);
var sum= 0;
a.forEach(v=>{
sum +=v;})
return sum;
}
3.2 ES6中, 我们可以这样写:
function fn(...a){
var sum = 0;
a.forEach(v=>{
sum += v;
});
return sum;
}
fn(1,2,3);//6
fn(1,2,3,4);//10