在 ES6 中,函数的参数可以设置默认值,这为我们编写更加简洁、易读、易维护的代码提供了便利。本文将详细介绍 ES6 中函数参数默认值的用法和指导意义。
基本用法
在 ES6 之前,我们通常使用以下方式为函数参数设置默认值:
function foo(x, y) {
x = x || 0;
y = y || 0;
// ...
}这种方式的问题在于,当 x 或 y 的值为 false、null、undefined、'' 等 falsy 值时,会被视为没有传递参数,进而使用默认值。这可能会导致一些意想不到的错误,例如:
foo(1, 2); // 正常执行 foo(0, 0); // x 和 y 均被设置为默认值 0 foo(null, ''); // x 和 y 均被设置为默认值 0
ES6 中,我们可以使用如下方式为函数参数设置默认值:
function foo(x = 0, y = 0) {
// ...
}这种方式会将 x 和 y 的默认值分别设置为 0。如果调用 foo 时不传递参数,x 和 y 将使用默认值 0:
foo(1, 2); // 正常执行 foo(0, 0); // 正常执行 foo(null, ''); // null 和 '' 均被视为传递了参数,正常执行 foo(); // x 和 y 均被设置为默认值 0
默认值表达式
函数参数的默认值可以是任意表达式,例如:
function foo(x = 1 + 1, y = x + 1) {
console.log(`x = ${x}, y = ${y}`);
}
foo(); // x = 2, y = 3在这个例子中,x 的默认值为 1 + 1,即 2,y 的默认值为 x + 1,即 3。
需要注意的是,函数参数的默认值是在函数调用时求值的,而不是在函数定义时求值的。这意味着,如果默认值是一个变量,那么该变量在每次函数调用时都会重新求值:
// www.javascriptcn.com code example
let x = 1;
function foo(y = x + 1) {
console.log(`y = ${y}`);
}
foo(); // y = 2
x = 2;
foo(); // y = 3默认值的暂时性死区
函数参数的默认值存在暂时性死区(Temporal Dead Zone,简称 TDZ)。在函数体内,如果尝试访问未初始化的函数参数,将会抛出一个 ReferenceError 异常:
function foo(x = y, y = 1) {
// ...
}
foo(); // 抛出 ReferenceError: y is not defined在这个例子中,x 的默认值表达式中访问了未初始化的参数 y,因此会抛出 ReferenceError 异常。
需要注意的是,如果函数参数的默认值是一个函数调用,那么该函数调用会在每次函数调用时执行:
// www.javascriptcn.com code example
function bar() {
console.log('bar');
}
function foo(x = bar()) {
console.log(`x = ${x}`);
}
foo(); // 输出 'bar' 和 'x = undefined'
foo(); // 输出 'bar' 和 'x = undefined'在这个例子中,函数 bar 是作为 x 的默认值,因此会在每次函数调用时执行。
指定 undefined 以使用默认值
如果想要使用函数参数的默认值,但是又不想使用默认值的话,可以将参数的值显式指定为 undefined:
function foo(x = 1, y = 2) {
console.log(`x = ${x}, y = ${y}`);
}
foo(undefined, 3); // x = 1, y = 3在这个例子中,x 的值被显式指定为 undefined,因此使用了默认值 1。
小结
ES6 中,函数参数的默认值为我们编写更加简洁、易读、易维护的代码提供了便利。在使用函数参数默认值时,需要注意以下几点:
- 函数参数默认值的求值时机是在函数调用时,而不是在函数定义时。
- 函数参数默认值存在暂时性死区,访问未初始化的函数参数会抛出
ReferenceError异常。 - 函数参数默认值可以是任意表达式,包括函数调用。
- 如果想要使用函数参数的默认值,但是又不想使用默认值的话,可以将参数的值显式指定为
undefined。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d103c3a941bf7134231a83