为对象解构参数设默认值必须在外层加= {},否则传undefined会报错;再配合属性级默认值(如a = 1),实现两层兜底:参数整体为空对象、各属性有默认值。

为整个对象设置默认值参数,关键是在解构形参的**最外层加 = {}**。这不是可选项,而是必须步骤——否则传入 undefined 时会直接报错。
为什么必须写 = {}?
函数调用时不传参,参数值就是 undefined。而解构操作只支持对象或数组,不能对 undefined 解构:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
-
错误写法(会报错):
const fn = ({ a = 1, b = 2 }) => {...}; fn();
→ 报错:Cannot destructure property 'a' of 'undefined' -
正确写法(兜底为空对象):
const fn = ({ a = 1, b = 2 } = {}) => {...}; fn();
→ 参数自动变为{},再安全解构,a和b取默认值
对象解构 + 两层默认值结构
完整模式是「对象参数默认值」+「属性级默认值」嵌套使用:
const toast = ({
title = "提示",
icon = "success",
duration = 1500
} = {}) => {
console.log({ title, icon, duration });
};
-
= {}:第一层,默认整个参数为一个空对象 -
title = "提示":第二层,当传入对象里没有title属性时,才启用该默认值
常见调用效果对比
-
toast();→ 使用全部默认值:{ title: "提示", icon: "success", duration: 1500 } -
toast({ title: "加载中" });→title被覆盖,其余仍用默认值 -
toast({ icon: "none", duration: 3000 });→ 只覆盖指定字段,title仍为 "提示" -
toast(null);→ 会报错(null不是对象,无法解构),所以生产环境建议额外校验或统一用?? {}防御
进阶:结合别名与深层默认值
你还可以在解构时重命名、嵌套解构,并为每层设默认值:
const renderUser = ({
name: userName = "匿名用户",
profile: { avatar = "/default.png", bio = "暂无介绍" } = {}
} = {}) => {
console.log(userName, avatar, bio);
};
- 外层
= {}防止未传参崩溃 -
name: userName是别名,避免变量冲突 -
profile = {}是嵌套对象的兜底,保证能继续解构avatar和bio










