Skip to content

一个函数需要的参数比较多,如果不传递参数,那么默认值均为 undefined,但是有时候我们不希望他的默认值为 undefined,就需要做很多单独的处理

js
function test(a,b,c){
	a===undefined && a = 0;//a的默认值为0
	b===undefined && b = 1;//b的默认值为1
	c===undefined && c = 2;//c的默认值为2
}

这样是非常麻烦的,在 ES 6 中提供了更加方便的方式来给函数的参数加默认值

js
function test(a = 1,b = 2,c = 3){
}

在 ES 6 中,使用上面这种方式就可以给函数的参数加上默认值。这样写之后,如果 a,b,c 的值为 undefined,则会自动赋为其默认值。

参数默认值有一些需要注意的地方,首先是对 arguments 的影响,我们知道在函数内使用 arguments 可以获取到传入的所有参数列表,并且 arguments 和参数变量是一一映射的

js
function test(a,b,c){
	console.log(arguments[0],arguments[1],arguments[2]);
	console.log(a,b,c);

	a = 1;
	console.log(arguments[0],arguments[1],arguments[2]);//发现arguments[0]跟着变
	console.log(a,b,c);
}

function test2(a,b=1,c){
	console.log(arguments[0],arguments[1],arguments[2]);
	console.log(a,b,c);

	a = 1;
	console.log(arguments[0],arguments[1],arguments[2]);//发现arguments[0]不再跟着变
	console.log(a,b,c);
}

test(1,2,3);
test2(1,2,3);

所以,如果使用了参数默认值这种方式,那么 arguments 和参数列表将脱离这样一个映射关系,也就是说修改一个不会影响另一个,要么使用参数,要么使用 arguments,不能再混用。

如果读者了解过严格模式,实际上,在严格模式下,arguments 和参数就是脱离了映射关系的,所以如果我们可以认为,使用了参数默认值,那么参数列表将自动变成严格模式下的规则,即 arguments 和参数脱离映射关系。

除此之外,还应注意暂时性死区的问题

js
function test(a = 1,b = a){

}
//以上代码没问题,虽然第二个参数用到了a,但是a在上一个参数的时候就已经有值了,所以不会产生问题

function test2(a = b,b = 1){

}
//这个代码就会出问题,因为在使用b的时候,b实际上还没有值

以笔记为镜,可以知得失