参数设置默认值
在es6之前,我们想要给函数的参数添加默认值,只能通过变通的方式
function func(a,b){
b = b || "tom";
console.log(x,y);
}
func("hello"); //hello tom
func("hello","world"); //hello world
func("hello",""); //hello tom
ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面。如下代码:
function fun(a,b=10,c=20){
return a+b+c;
}
console.log( fun(30) ) //60
console.log( fun(10,undefined,30) ) //50
console.log( fun(10,null,30) ) //40 注意:null在数学中,默认的为0,不要传递null
注意:只要给函数加上了参数默认值,该函数就自动变成严格模式。当参数传递了值,便不会再看默认值了
严格模式中,arguments和函数的形参不存在关系,没有对应的映射关系
注意:形参和let,const一样,有自己的作用域,根据声明的顺序,会产生临时性死区(参数声明前不能被调用),示例如下:
function test(a=b,b){
console.log(a,b)
}
test(undefined,2) //Cannot access 'b' before initialization
参数默认值的位置
function func(a,b=2,c){
console.log(a,b,c);
}
func(); //undefined 2 undefined
func(1); //1 2 undefined
func(1, ,3); //Uncaught SyntaxError: Unexpected token
func(1,undefined,3);//1 2 3
func(1,null,3); //1 null 3
上面代码中,有默认值的参数都不是尾参数。这时,无法只省略该参数,而不省略它后面的参数,除非显式输入undefined。
如果传入undefined,将触发该参数等于默认值,null则没有这个效果。
函数的length属性和作用域
length:
指定了默认值以后,函数的length属性,将返回没有指定默认值的参数个数。也就是说,指定了默认值后,length属性将失真。
作用域:
一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域(context)。等到初始化结束,这个作用域就会消失。这种语法行为,在不设置参数默认值时,是不会出现的。
ES6 的写法还有两个好处:
1、增强可阅读性,阅读代码的人,可以立刻意识到哪些参数是可以省略的,不用查看函数体或文档;
2、有利于将来的代码优化,即使未来的版本在对外接口中,彻底拿掉这个参数,也不会导致以前的代码无法运行。