JavaScript的默认参数是ES6引入的一个便捷特性,允许开发者为函数参数设定默认值。乍看之下,这个功能似乎能简化代码并提高可读性,但谷歌的工程团队往往会有意避开这个特性。这背后有哪些原因?
可能导致的微妙错误
默认参数的行为与许多开发者的直觉不符。当传入 undefined 时,默认值会被触发,但传入 null 、空字符串或数字 0 时则不会。这种差异可能导致难以追踪的bug:
function greet(name = "Guest") {
console.log(`Hello, ${name}!`);
}
greet(undefined); // "Hello, Guest!"
greet(null); // "Hello, null!"
greet(""); // "Hello, !"
greet(0); // "Hello, 0!"
影响代码的可预测性
默认参数会在函数被调用时求值,而非函数定义时。这意味着每次调用函数时,默认值都会被重新计算:

与闭包和作用域的复杂交互
默认参数可以引用先前定义的参数,这会创建一个特殊的作用域环境,与函数体分离:

降低代码可读性
当默认参数逻辑变得复杂时,函数签名会变得冗长难读:

替代方案
谷歌工程师通常更倾向于使用显式的参数处理模式:

或使用对象解构模式:
function processData(data, options) {
const {
format = "json",
version = "1.0"
} = options || {};
// 函数体
}
在大型团队协作和复杂项目中,明确的参数处理能减少错误,提高代码质量。这并不意味着默认参数总是应该被避免,而是开发者应该充分了解其行为特点和潜在陷阱,在适当的场景下使用它们。