最稳妥的方式是使用 obj.hasownproperty(key) && obj[key],先确保键为对象自身属性再判断其值是否为真值,避免原型链干扰和假值误判,同时利用短路求值防止报错。

直接用 obj.hasOwnProperty(key) && obj[key] 最稳妥,兼顾存在性与真值判断。
检查键是否存在且值为真
关键在于两步:先确认键是对象自身的属性(非继承),再判断其值是否为真值(truthy)。
-
obj.hasOwnProperty(key)排除原型链上的属性,确保是对象自身拥有的键 -
obj[key]在键存在前提下取值,JavaScript 自动进行真值转换(0、''、null、undefined、false、NaN都为假值) - 两者用
&&连接,短路求值:若键不存在,右侧不会执行,避免undefined取值报错或误判
注意区分 == null 和真值判断
如果只想排除 null 和 undefined,但接受 0 或空字符串,就不要用真值判断。
- 写成
obj.hasOwnProperty(key) && obj[key] != null可保留0、false、'' - 而
obj?.[key](可选链)只防undefined报错,不检查键是否存在,也不做真值判断 -
key in obj会命中原型链属性,比如'toString' in {}返回true,通常不是你想要的
常见误用场景
以下写法容易出问题:
-
if (obj.key)—— 若key不存在,返回undefined,转为布尔是false,但无法区分“键不存在”和“键存在但值为假” -
if (obj[key])—— 键不存在时同样得undefined,逻辑同上;若obj是null或undefined,还会抛TypeError -
if (obj[key] !== undefined)—— 能确认键存在且非undefined,但0、false、''会被当作“有值”,不符合“值为真”的要求
封装成可复用函数
需要频繁使用时,可以封装一个工具函数:
function hasTruthyKey(obj, key) {
return obj != null &&
typeof obj === 'object' &&
obj.hasOwnProperty(key) &&
obj[key];
}
加了 obj != null 和类型检查,避免传入 null、undefined 或原始值时报错。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











