判断对象属性是否存在且非空需区分存在性与真值:用object.hasown()检查自身属性存在;若需属性存在且非null/undefined,用obj?.prop != null;允许0/false时避免if(obj.prop),推荐显式判断;嵌套属性用可选链+空值合并;多处使用建议封装isnonempty或isfilled工具函数。

判断对象属性是否存在且非空,关键在于区分 属性存在性、值是否为真值(truthy),以及是否要排除 null、undefined、空字符串、0、false 等特殊情况。实际开发中需按需选择,不能一概而用 if (obj.prop)。
检查属性是否存在(不关心值)
仅确认对象自身是否有该属性(不含原型链),用 Object.hasOwn()(推荐,ES2022+)或 hasOwnProperty():
-
Object.hasOwn(obj, 'name')—— 安全、现代,可处理 null/undefined 输入 -
obj.hasOwnProperty('name')—— 需确保obj是对象,否则报错 -
'name' in obj—— 会查找原型链,不满足“自身属性”要求时慎用
检查属性存在且为真值(常用场景)
多数业务逻辑需要“属性有定义且不是 null/undefined/''/0/false”,但要注意:0 和 false 是合法有效值,不应被误判为“空”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 若允许
0、false、''(比如表单中“年龄=0”、“启用=false”有意义),应显式排除null和undefined:obj.prop !== undefined && obj.prop !== null - 若业务上认为
0、false、''也属于“空”,可用obj.prop直接判断(即if (obj.prop)),但必须清楚其副作用 - 更明确的写法(推荐):
obj?.prop != null && obj.prop !== ''(兼顾可选链与空字符串)
安全访问嵌套属性并判断非空
避免 Cannot read property 'x' of undefined 错误,结合可选链(?.)和空值合并(??):
-
obj?.user?.name—— 属性不存在时返回undefined,不会报错 -
obj?.settings?.theme ?? 'light'—— 提供默认值,适合配置读取 - 组合判断:
const theme = obj?.settings?.theme;<br>if (theme != null && theme !== '') { /* 使用 theme */ }
封装可复用的工具函数
当多处需要统一语义(如“非空字符串/数字/对象”),建议封装:
-
isNonEmpty(obj, key):检查obj[key]是否存在且非null/undefined -
isFilled(obj, key):进一步排除''、0、false(按需定制) - 示例:
const isFilled = (obj, key) => {<br> const val = obj?.[key];<br> return val != null && val !== '' && val !== false && !(Number.isFinite(val) && isNaN(val));<br>};
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










