可选链(?.)与空值合并(??)配合可安全、简洁访问嵌套响应数据:?.在null/undefined时短路返回undefined避免报错,??仅在null/undefined时提供默认值,二者组合实现健壮的数据提取。

用 fetch 请求接口时,后端返回结构常不一致——可能缺字段、嵌套层级为空、甚至整个 data 是 null 或 undefined。直接链式取值容易报错,而双问号(??)和可选链(?.)配合使用,能写出既安全又简洁的处理逻辑。
安全读取嵌套响应数据
接口返回类似 { code: 200, data: { user: { name: "Alice" } } },但 data 或 user 可能为 null。传统写法要层层判断:
const name = res && res.data && res.data.user && res.data.user.name;
用可选链一步到位:
const name = res?.data?.user?.name;
如果中间任意一环是 null 或 undefined,整条链自动短路,返回 undefined,不会报错。
给缺失字段设真正意义上的默认值
比如想取用户年龄,默认为 18,但后端可能返回 { age: 0 }——0 是合法值,不该被覆盖:
-
res?.data?.age || 18→ 错!0是假值,会被替换成18 -
res?.data?.age ?? 18→ 对!只在age是null或undefined时才用18
再比如列表为空时提供空数组:
const list = res?.data?.items ?? [];
即使 res、data 或 items 任一环节不存在,最终得到的都是一个数组,可直接 .map() 或 .length。
组合处理完整请求流程
从 fetch 到数据消费,全程防御:
fetch('/api/user')
.then(res => res.json())
.then(json => {
// 确保 json 是对象,再安全取值
const id = json?.id ?? 'unknown';
const avatar = json?.profile?.avatar ?? '/default-avatar.png';
const tags = json?.settings?.tags ?? [];
render({ id, avatar, tags });
})
.catch(err => console.error('Fetch failed:', err));
注意:?? 不会“修复”网络错误或解析失败,它只作用于已成功解析的 JS 值;所以仍需 try/catch 或 .catch() 处理异常。
避免常见陷阱
别在 fetch 调用本身用 ?. —— fetch?.('/api') 没意义,因为 fetch 是全局函数,不会为 undefined。
?? 不能替代类型检查 —— 它只判 null/undefined,对字符串 "null"、数字 0、空对象 {} 都不触发默认值。
链式调用中优先级要注意:a?.b ?? c 等价于 (a?.b) ?? c,不是 a?.(b ?? c),括号可显式强化意图。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











