Avatar ·

如何在JavaScript中设置函数参数的默认值?

大家好!我刚开始学习JavaScript,遇到了一个问题。我正在编写一个向用户打招呼的函数。我希望如果没有传入名字,则使用“Гость”作为默认值。这是我的代码: ```javascript function greet(name) { return "Привет, " + name + "!"; } console.log(greet("Анна")); // Привет, Анна! console.log(greet()); // Привет, undefined! ``` 如您所见,如果我在没有参数的情况下调用函数,字符串中会出现“undefined”。我读到在其他语言中,例如Python,可以直接在参数中设置默认值。那么在JavaScript中如何做到这一点?我尝试过写`function greet(name = "Гость")`,但不确定是否正确,以及是否在所有浏览器中都能工作。 我还听说过一种旧方法,通过检查`if (typeof name === 'undefined')`。哪种方法更好?在这个上下文中,`undefined`和`null`有区别吗?希望能得到详细的解释和示例。 <<>>

参数默认值(ES6 新特性)

您尝试的 function greet(name = "Гость") 是完全正确的!这是 ES6(ES2015)中引入的现代语法,可以直接在参数中设置默认值。目前所有现代浏览器都支持这一特性(包括 Chrome、Firefox、Safari、Edge 等),但如果您需要兼容 IE11 或更旧的浏览器,则需要使用后续提到的旧方法。

// 现代方式(推荐)
function greet(name = "Гость") {
  return "Привет, " + name + "!";
}

console.log(greet("Анна")); // Привет, Анна!
console.log(greet());       // Привет, Гость!

旧方法(兼容性方式)

在 ES6 之前,开发者通常是手动检查参数是否为 undefined:

// 旧方式(兼容所有浏览器)
function greet(name) {
  if (typeof name === 'undefined') {
    name = "Гость";
  }
  return "Привет, " + name + "!";
}

// 或者使用更简洁的三元运算符
function greet(name) {
  name = (typeof name !== 'undefined') ? name : "Гость";
  return "Привет, " + name + "!";
}

哪种方式更好?

推荐使用默认参数语法(ES6),原因如下:

  • 代码更简洁、可读性更好
  • 错误率更低(不需要手动检查)
  • 只在函数调用时求值(惰性求值)
  • 现代项目已普遍使用,多数构建工具(Babel 等)也可将其转换为兼容旧浏览器的代码

除非您的项目明确需要支持 IE11 或更老的浏览器,否则请使用默认参数语法。

undefined 与 null 的区别

在这个上下文中,两者有重要区别:

// undefined:表示变量已声明但未赋值(或没有传入参数)
let value1;
console.log(value1); // undefined

// null:表示变量有值,该值为「空」
let value2 = null;
console.log(value2); // null

// 在默认参数中传入 undefined 会触发默认值
function test(x = "默认值") {
  console.log(x);
}
test(undefined); // "默认值"(触发默认值)
test(null);      // null(不触发默认值!)

因此,如果您的用户可能显式传入 null,则默认参数不会生效。如果您希望将 null 也视为「空值」,可以考虑在函数内部统一处理:

function greet(name) {
  // 将 null 也转为默认值
  if (name == null) { // 同时匹配 null 和 undefined
    name = "Гость";
  }
  return "Привет, " + name + "!";
}