对于JS函数参数传入,在实际运用中常常使用默认。包括不同参数个数下少传、错传或依赖传入状态下,稳健的默认参数设置都是JS函数不报错、不出bug的重要手段。
一、默认参数的表现形式种类
1.“或”表达式赋值方式
function markeRe(url,timeout,callback){
timeout=timeout || 2000;
callback=callback || function(){};
//函数的其余部分
}
2.“三目”表达式赋值方式
function markeRe(url,timeout,callback){
timeout=timeout?timeout:2000;
callback=callback?callback:function(){};
//函数的其余部分
}
3.改进后的安全“三目”表达式赋值方式
function markeRe(url,timeout,callback){
timeout=(typeof timeout !="undefined")?timeout:2000;
callback=(typeof callback !="undefined")?callback:function(){};
//函数的其余部分
}
4.直接定义参数赋值方式
function markeRe(url,timeout=2000,callback=function(){}){
//函数的其余部分
}
5.依赖赋值方式
function markeRe(first,second=first,three=first*second){
return first+second+three;
}
console.log(markeRe(1)); //输入结果:3
console.log(markeRe(1,2)); //输入结果:5
console.log(markeRe(1,undefined,3)); //输入结果:5
6.不定参数传入方式
function markeRe(first,...keys){
let result=first;
for(let i=0,len=keys.length;i<len;i++){
result+=keys[i];
}
return result;
}
var first=10;
console.log(markeRe(first,1,2)); //输出结果:13
console.log(markeRe(first,1,2,3)); //输出结果:16
console.log(markeRe(first,1,2,3,4)); //输出结果:20
console.log(markeRe(first,1,2,3,4,5)); //输出结果:25
//其他更多参数,如first,1,2,3,4,5,6...
var keys=[1,2,3,4,5]
console.log (markeRe(first,...keys)); //输出结果:25
//其他更多参数,如var keys=[1,2,3,4,5,6…]
7.构造函数传入方式
var add=new Function("first","second=first","return first+second");
console.log(add(1,1)); //输出结果:2
console.log(add(1)); //输出结果:2
二、默认参数的注意事项
1.非严格模式下,传入的默认参数可以在函数内部进行改变,相应的arguments对象也会对等改变。但是,在严格模式下,传入的默认参数不能改变。即使进行了改变,arguments也是记录的传入值,会造成非期望结果或出现错误bug等现象。
2.如果将浏览器设置为ES6解释,默认方式执行严格模式,即传入的默认参数不可在函数内部进行改变。
3.为保证函数运行更加稳健,推荐对默认进行typeof安全检查设置。
4.对于依赖参数使用时,被依赖的参数必须是正确且必传参数,否则将报错。
5.当使用函数调用结果作为默认参数值时,如果忘记写小括号,此时,传入的是对函数的引用,而不是对函数调用的结果。
6.对于不定默认参数传入形式时,只能将不定参数放在参数最后一个,否则将出现非期望结果或出现错误bug等现象。且每个函数最多只能声明一个不定参数,否则将报错。