很多时候会给函数的参数设置默认值,方式就像下面两种:
function a(param1,param2){
param1 = param1 || 'default_value';
param2 = param2 !== undefined ? param2 : 'default_value';
...
}
上面这段代码通常的意义是: 如过没有传入 param1、param2 参数,给它赋值默认值 ‘default_value’。
- param1 可能会有风险,如果你传入 0 、’’、null 等类型转换后为 false 的值,返回的是 ''default_value"。
- param2 也有些需要注意的地方,如果显示的传入 undefined,那么函数是无法区分参数是不是显示的传入 undefined 的(虽然没有太大影响)。
默认参数值
现在 ES6 有以下这种新语法来给参数设定默认值:
function b(param1 = 'default_value',params2 = 'default_value'){
...
}
- 以上这种缺省参数设置默认值的方法显然要简单很多,不过它的功能和 param2 !== undefined ? param2 : ‘default_value’; 是相似的,同样不能区分 undefined 是不是显示传入的。
我尝试过给剩余参数设定默认值,这样是不行的:
// 不是合法的语法
function c(...params=[1,2,3]){
}
默认参数值不止可以传入值,还可以传入表达式和函数
const x = 1;
const returnNumber = () => {
console.log("返回4")
return 4;
}
function d(param1 = x + 5,parma2 = param1 + returnNumber()){
console.log(param1,parma2)
}
// 正常传参
d(1,1); // 1 1
// 不传参
d(); // 返回4
// 6 10
- 可以看出传入表达式和函数的时候,是惰性求值的,正常传参的时候并没有执行 returnNumber 函数,只有在参数缺省或为 undefined 的时候才执行。
默认参数值还有一个重要的点
const x = 1;
const param3 = 1;
function e(param1 = x + 1,param2 = param1 + 1,param3 = param3 + 1){
...
}
e(); // Uncaught ReferenceError: Cannot access 'param3' before initialization
- 默认参数值是在函数 {} 包裹的作用域内的,你可以把默认参数值当作 let 声明。也就是说,在变量未初始化完成之前,是不能去获取值的,会触发暂时性死区的问题。
上面的例子可以看作进行了如下操作
const x = 1;
const param3Value = 1;
function e(param1,param2,param3){
let param1Value = param1 !== undefined ? param1 : x + 1;
let param2Value = param2 !== undefined ? param2 : param1Value + 1;
// 在 param3Value 未初始化完成之前就去获取它的值
let param3Value = param3 !== undefined ? param3 : param3Value + 1;
...
}
e(); // Uncaught ReferenceError: Cannot access 'param3' before initialization