箭头函数中默认参数需赋给整个对象参数而非解构内部,正确写法为({a=1,b=2,c}={})=>{};因语法限制,({a,b}={a:1,b:2})会报错;支持嵌套解构与多层默认值,如retry对象内再解构max、delay。

箭头函数本身不支持直接在参数列表中写默认对象(如 ({ a, b } = { a: 1, b: 2 }) => ...),但可以通过解构 + 默认参数的组合方式实现——关键在于把默认值设在**整个对象参数上**,而不是解构内部。
正确写法:默认值赋给对象参数,再解构
这是最常用且推荐的方式。先为形参指定一个默认对象,再对它进行解构:
const fn = ({ a = 1, b = 2, c } = {}) => {
console.log(a, b, c); // a、b 有默认值;c 无默认,取传入对象中的值
};
fn({ a: 10, c: 3 }); // 输出:10 2 3
fn(); // 输出:1 2 undefined(因为 {} 中没 a/b/c,所以用解构默认值)
为什么不能写成 ({ a, b } = { a: 1, b: 2 })?
JavaScript 语法不允许在解构模式里直接写等号赋默认值(那会解析成赋值表达式,报错)。下面写法是非法的:
// ❌ 语法错误!
const bad = ({ a, b } = { a: 1, b: 2 }) => a + b;
原因:参数列表中 { a, b } = ... 的 = 被解释为**默认参数赋值操作符**,而它的左侧必须是简单标识符或带默认值的解构模式,不能是纯解构模式后接 = 对象字面量。
立即学习“Java免费学习笔记(深入)”;
进阶技巧:嵌套解构 + 多层默认值
可以一层层设置默认值,让结构更健壮:
const configFn = ({
api = 'https://api.example.com',
timeout = 5000,
headers = {},
retry = { max: 3, delay: 1000 }
} = {}) => {
const { max = 3, delay = 1000 } = retry; // retry 本身也有默认,再解构它
console.log(api, timeout, headers, max, delay);
};
- 外层
= {}防止传undefined导致解构失败 - 每个字段都可设独立默认值(
a = 1) - 嵌套对象(如
retry)也支持默认 + 二次解构
常见坑与替代方案
如果想兼容旧写法或逻辑复杂,也可手动合并默认值:
const safeFn = (opts) => {
const { a = 1, b = 2, c } = { ...{ a: 1, b: 2 }, ...opts };
return a + b + (c || 0);
};
但这种方式冗余,不如原生默认参数简洁。仅在需要深度合并(如 Object.assign 或递归 merge)时考虑。


















