参数默认值
一般情况下,在函数传递参数时,会将参数全部传入,而很多情况下在参数变多的时候有些时候就会变得麻烦起来,而很多种情况下有一大部分参数都是不会变的,因为既要保证灵活性,同时又要方便的调用这样就在ES6中引入了一个新的概念:参数默认值。
在之前我们要完成这样一个默认值的方法需要些很多的代码比较麻烦,而在ES6中书写形参时直接给形参赋值,赋的值即为默认值。
这样一来当调用函数时,如果没有给对应的参数赋值,给它的值是undefined
则会自动使用默认值
- 注意一定得是
undefined
不能是null
,因为null
在数学运算中null
为0。
function sun (a, b = 1, c = 2) {}
sun(1, undefined,undefined)//此时也可以不写
且不光可以是字面量,也可以是表达式。
参数默认值对arguments
的影响
在严格模式下arguments
跟形参是脱离的,而在非严格模式下则是不脱离的。
function test(a, b) {
console.log("arguments", arguments[0], arguments[1]);
console.log("a:", a, "b:", b);//此时我们输出abarguments和a的值是一样的
a = 3;//在设定好之后我们更改a值
console.log("arguments", arguments[0], arguments[1]);
console.log("a:", a, "b:", b);//此时在非严格模式下是没有变化的
}
而在严格模式下arguments
是不会发生改变的,也就是说你要么用arguments
要么直接更改。
而只要给函数加上参数默认值,该函数会自动变成严格模式下的规则arguments
和形参脱离。
function test(a, b = 1) {
console.log("arguments", arguments[0], arguments[1]);
console.log("a:", a, "b:", b);//此时我们输出abarguments和a的值是一样的
a = 3;//在设定好之后我们更改a值
console.log("arguments", arguments[0], arguments[1]);
console.log("a:", a, "b:", b);//此时在严格模式下是脱离的的
}
而arguments
在以后尽量就不要使用了在后面我会讲到具体原因的。
留意暂时性死区
形参和ES6中的let
和const
声明一样,具有作用域,并且根据参数的声明顺序,存在暂时性死区。
这是什么意思呢,让我们来举个例子:
function test (a, b = a) {
console.log(a, b)
}
test(1, 2)//在这种情况下是完全没问题的,因为我们并没用到默认值
function test (a, b = a) {
console.log(a, b);
}
test(1, undefined)//在这种情况下也是没有问题的因为我们是先给a赋值再让b = a所以没问题
function test (a = b, b) {
console.log(a, b);
}
test(undefined, 2)//在这种情况下就会报错
而报错的原因就是我们在没有给a
设置制值的情况下会在声明之后将其存入暂时性死区里,之后在有任何改动,比如赋值的情况下会将其取出。
所以我们在以后我们在使用let
定义变量名的时候不能与形参重复。
以上就是参数默认值的介绍和其他扩展的知识希望对你有所帮助。