You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ES6函数对象参数:传入部分属性时如何保留未传参默认值?

这个问题其实挺典型的——ES6里给函数参数设对象默认值时,只有当你完全不传参数的时候,默认对象才会生效。一旦你传了哪怕是只有部分属性的对象,整个默认对象就被替换掉了,没传的属性自然就成了undefined。

用扩展运算符(...)来合并默认值和传入参数,就能轻松解决这个问题,给你两种实用的写法:

1. 函数内部合并默认值与传入参数

这种写法最直观,先给参数设一个空对象作为兜底默认值,然后在函数内部用扩展运算符把预设的默认对象和传入的参数合并——传入的属性会覆盖默认值,没传入的就保留默认值:

function exampleFunction(objParam = {}) {
  // 合并默认配置和传入参数,传入的属性优先级更高
  const mergedParams = { val1: 1, val2: 2, ...objParam };
  
  // 后续逻辑直接用 mergedParams 即可
  console.log(mergedParams.val1, mergedParams.val2);
}

// 测试一下:
exampleFunction(); // 输出 1 2(完全用默认值)
exampleFunction({ val1: 3 }); // 输出 3 2(val2保留默认)
exampleFunction({ val2: 4 }); // 输出 1 4(val1保留默认)
exampleFunction({ val1: 3, val2: 4 }); // 输出 3 4(完全用传入值)

2. 参数解构时结合扩展(进阶写法)

如果你希望在参数层面就处理好合并,也可以结合对象解构和扩展运算符,不过这种写法更适合需要直接提取属性的场景:

function exampleFunction({ ...receivedParams } = {}) {
  const mergedParams = { val1: 1, val2: 2, ...receivedParams };
  // 后续操作和上面一致
}

原理说明

扩展运算符...会把传入对象的所有可枚举属性展开,然后和默认对象进行合并。当属性名重复时,后面的属性(也就是传入的参数)会覆盖前面的默认属性,这样就保证了所有属性始终有值——要么是你传入的,要么是预设的默认值。

内容的提问来源于stack exchange,提问作者Ian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:15:20