核心是预防对 undefined 或 null 的访问,推荐用可选链操作符(?.)安全访问属性、数组索引和方法,并配合空值合并操作符(??)提供默认值;必要时手动检查或使用 in/hasownproperty 判断动态属性。

核心是别让访问发生在 undefined 或 null 值上——不是等报错再修,而是提前拦住它。
用可选链操作符(?.)快速兜底
这是现代 JavaScript 最简洁、最推荐的方式。它会在链中任意一级为 undefined 或 null 时自动中断访问,返回 undefined 而非抛错。
-
user?.profile?.address?.city—— 安全,哪怕user是undefined,也不会崩溃 -
data?.items?.[0]?.name—— 同样适用于数组索引,避免空数组或items不存在的问题 - 注意:
?.()还能安全调用可能不存在的方法,obj?.method?.()
搭配空值合并操作符(??)提供默认值
可选链只解决“不崩溃”,但有时你需要一个可用的值。配合 ?? 可自然 fallback:
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
const city = user?.profile?.address?.city ?? 'Unknown';const count = items?.length ?? 0;- 它只在左侧为
null或undefined时生效,不会把0、false、''当作空值处理(这点比||更精准)
必要时手动检查对象存在性
某些场景(比如需要精确区分 null 和 undefined,或做复杂校验)仍需显式判断:
- 用
!= null简洁覆盖两种空值:if (obj != null && typeof obj === 'object') - 避免先取属性再判断:
obj.prop && obj.prop.id不安全,因为obj.prop可能是undefined,再访问.id就报错 - 更稳妥写法:
obj?.prop?.id或obj && obj.prop && obj.prop.id
对动态属性名使用 in 操作符或 hasOwnProperty
当你不确定某个 key 是否存在,又不想依赖可选链(比如 key 是变量),可用:
-
'city' in user?.profile?.address—— 检查原型链上的属性 -
user?.profile?.address?.hasOwnProperty('city')—— 仅检查自身属性(不含继承) - 注意:
user?.profile?.address?.city !== undefined也能判断,但不如in或hasOwnProperty明确表达“是否存在”意图










