ES6 中的函数参数默认值详解

在 ES6 中,我们可以为函数参数设置默认值,这在很多情况下都很方便。在本文中,我们将深入探究函数参数默认值的细节,并为你提供一些实用的例子。

基本用法

在 ES6 之前,我们经常会使用类似以下的方法为函数设置默认参数值:

function greet(name) {
  name = name || 'World';
  console.log('Hello, ' + name + '!');
}

然而,这种方式存在一些问题,如果传入的参数是布尔值 false、空字符串 "" 或者数字 0 都不能触发默认值:

greet(false); // Hello, World!
greet('');    // Hello, World!
greet(0);     // Hello, World!

在 ES6 中,我们可以使用更为简单的语法为函数设置默认值:

function greet(name = 'World') {
  console.log('Hello, ' + name + '!');
}

这种方法不仅代码更为简洁,而且能够正确处理布尔值 false、空字符串 "" 或者数字 0:

greet(false); // Hello, false!
greet('');     // Hello, !
greet(0);      // Hello, 0!

默认参数表达式

当我们为函数参数设置默认值时,可以使用任何值作为默认值,包括表达式。例如:

function greet(name = getDefaultName()) {
  console.log('Hello, ' + name + '!');
}

function getDefaultName() {
  return 'World';
}

在这个例子中,getDefaultName 函数没有被调用,因为我们已经为 name 参数设置了默认值。

默认参数值的新行为

参数默认值有一个新的行为,即当函数被调用时,每次都会重新计算默认值表达式。例如:

function getNow() {
  return new Date().getTime();
}

function logTimestamp(timestamp = getNow()) {
  console.log(timestamp);
}

logTimestamp(); // 输出当前时间戳
setTimeout(() => {
  logTimestamp(); // 输出另一个时间戳
}, 500);

注意,如果我们省略参数,而它又带有默认值,此时函数的 length 属性并不会受到影响:

function greet(name = 'World') {
  console.log('Hello, ' + name + '!');
}

console.log(greet.length); // 0

函数参数默认值和解构赋值

我们可以将解构赋值和函数参数默认值进行结合使用:

function greet({ firstname = 'John', lastname = 'Doe' }) {
  console.log(`Hello, ${firstname} ${lastname}!`);
}

greet({ firstname: 'Bob' }); // 输出 "Hello, Bob Doe!"

当对象参数没有提供 firstname 或 lastname 字段时,那么它们的值将会是默认的 'John' 或 'Doe'。

注意,在使用解构赋值时,如果我们希望 firstname 和 lastname 也拥有默认值,我们不能写成这种形式:

function greet({ firstname, lastname } = { firstname: 'John', lastname: 'Doe'}) {
  console.log(`Hello, ${firstname} ${lastname}!`);
}

greet(); // 输出 "Hello, John Doe!"

这种写法虽然看似正确,但却存在一个陷阱,即当我们传递参数的时候 firstname 和 lastname 将会全都为 undefined,因为这时我们已经指定了参数的默认值,此时函数体内不会再去尝试绑定没有被赋值的变量。

其他用法

设置可变参数

我们可以使用参数默认值来设置可变参数,比如:

function sum(...numbers) {
  return numbers.reduce((a, b) => a + b, 0);
}

console.log(sum(1, 2, 3)); // 6
console.log(sum());        // 0

设置回调函数

我们可以在函数参数中为回调函数设置默认值,比如:

function square(x, callback = () => {}) {
  callback(x * x);
}

square(10, result => console.log(result)); // 输出 100
square(10);                                // 没有输出

在这个例子中,我们为回调函数设置了一个空函数作为默认值,当调用了 square 函数时,如果没有传入回调函数,那么什么也不会发生。

单位换算

我们可以使用参数默认值处理单位换算,比如:

function convert(value, unit = 'cm') {
  const units = { 'cm': 1, 'mm': 0.1, 'inch': 2.54 };
  return value * units[unit];
}

console.log(convert(10));          // 10
console.log(convert(10, 'mm'));    // 1
console.log(convert(10, 'inch'));  // 25.4

在这个例子中,我们使用对象来存储不同单位的换算比例,然后使用参数默认值将单位设置为 'cm'。

总结

函数参数默认值是 ES6 中一些非常有用的特性,它可以让我们在定义函数时更为简洁和精确。我们可以使用任何值作为默认值,包括表达式,同时也可以和解构赋值等语法进行组合使用,有了这些知识,我们可以更好地应对开发中的需求。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a89538add4f0e0ff1bb4f5


纠错反馈