预备知识
ES6函数的扩展
1.函数参数的默认值
ES6之前不能直接对函数的参数指定默认值。对参数y赋值:
y = y || expression
但是如果expression的结果为false,该赋值不起作用。为了避免这个问题,可以先判断参数y是否赋值了
if (typeof y === 'undefined') {
y = 'World';
}
ES6允许直接在参数定义时,给参数赋默认值
function fun(x, y = 'hello'){
...
}
[Note]
- 参数变量是默认声明的,所以不能用let或const再次声明。
- 使用参数默认值时,函数不能有同名参数。
- 参数默认值不是传值的,而是每次都重新计算默认值表达式的值。也就是说,参数默认值是惰性求值的。
function foo(x = 5) {
let x = 1; // error
const x = 2; // error
}
// 不报错
function foo(x, x, y) {
// ...
}
// 报错
function foo(x, x, y = 1) {
// ...
}
// SyntaxError: Duplicate parameter name not allowed in this context
let x = 99;
function foo(p = x + 1) {
console.log(p);
}
foo() // 100
x = 100;
foo() // 101
与解构赋值默认值结合使用(待补充)
默认参数的位置
一般有默认值的参数放在参数中的尾部。如果不在尾部,要传入该参数的默认值,需要在此位置显示传入undefined
function f(x, y = 5, z) {
return [x, y, z];
}
f() // [undefined, 5, undefined]
f(1) // [1, 5, undefined]
f(1, ,2) // 报错
f(1, undefined,