默认参数值

很多时候会给函数的参数设置默认值,方式就像下面两种:

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值