函数参数解构赋值需双重默认值兜底:外层= {}防undefined报错,内层为属性设默认值;嵌套结构需逐层= {};数组解构同理;null需用??预处理。

在函数参数中使用解构赋值并设置默认值,核心是两层兜底:外层防止 undefined 导致解构报错,内层为具体属性提供默认值。它比手动校验简洁、语义清晰,特别适合处理配置对象。
基础写法:对象解构 + 双重默认值
必须在外层加 = {},否则传入 undefined 或 null 会直接报错;再在解构模式里为各字段设默认值:
function request({ url, method = 'GET', timeout = 5000 } = {}) { ... }- 调用
request()或request(undefined)都不会崩溃,url是undefined,method和timeout取默认值 - 传
request({ url: '/api' })时,method和timeout仍生效
嵌套结构也要逐层兜底
如果要解构深层属性(比如 config.data.code),每一级对象都要单独设默认值,否则遇到 null 或缺失层级就报错:
function init({ data: { code = 0, msg = '' } = {} } = {}) { ... }- 第一个
= {}防止整个参数为undefined - 第二个
= {}防止data为undefined或null(注意:null不触发默认值,但这里data: { } = {}的= {}是作用于data所在层级的解构模式)
数组参数解构也能设默认值
适用于按位置接收数据,比如坐标、状态码等固定结构的数组:
function drawPoint([x = 0, y = 0] = []) { console.log(x, y); }-
drawPoint()→0, 0;drawPoint([10])→10, 0;drawPoint([10, 20])→10, 20 - 跳过中间项也支持:
function getFirstAndLast([first, , , last = '末尾'] = []) { return [first, last]; }
想让 null 也走默认值?先用 ?? 预处理
默认值机制只对 undefined 生效,null 被视为“存在但为空”的值。若需统一处理,可提前用空值合并操作符兜底:
-
function handleUser({ name = '游客', role = 'user' } = {}) { ... }——null传入会报错 - 更鲁棒写法:
function handleUser(config) { const { name = '游客', role = 'user' } = config ?? {}; ... } - 或一步到位:
function handleUser({ name = '游客', role = 'user' } = (config ?? {})) { ... }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











