为何大厂内部都在避免使用 JavaScript 默认参数?


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 || {};  
    
  // 函数体  
}  

在大型团队协作和复杂项目中,明确的参数处理能减少错误,提高代码质量。这并不意味着默认参数总是应该被避免,而是开发者应该充分了解其行为特点和潜在陷阱,在适当的场景下使用它们。