应优先使用 Object.hasOwn(obj, 'key') 检查对象自身属性,它语义明确、防原型污染、支持不可枚举属性及 null 原型对象;判断能否访问属性(含原型链)则用 'key' in obj。

检查对象是否存在某个属性,关键不是“怎么写”,而是“你想确认什么”——是只看对象自己有没有这个键,还是看它能不能访问到这个属性(哪怕来自原型)?选错方法,轻则逻辑出错,重则运行时崩溃。
查对象自身有没有这个属性
用 Object.hasOwn(obj, 'key') 最稳妥。它是 ES2022 标准方法,语义明确、不被原型污染、调用简洁:
- 能检测所有自有属性,包括不可枚举的(比如
Object.defineProperty(obj, 'x', { value: 1, enumerable: false })) - 即使对象是
Object.create(null)或自身覆盖了hasOwnProperty,也能正常工作 - 现代环境(Node.js 16.9+、Chrome 93+、Firefox 91+、Safari 16.4+)已原生支持
兼容旧环境时,回退到 Object.prototype.hasOwnProperty.call(obj, 'key') 即可,避免直接调用 obj.hasOwnProperty('key') 带来的风险。
查属性是否能在对象上访问到(含原型链)
用 'key' in obj 或 Reflect.has(obj, 'key'):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
-
'key' in obj是语法级操作符,引擎优化充分,适合大多数场景,比如判断方法是否存在、做兜底配置 - 两者都包含不可枚举属性和继承属性(如
toString),且不会触发 getter -
Reflect.has更适合元编程(如 Proxy 中拦截),行为与in完全一致
这些方式千万别用来判断存在性
obj.key !== undefined 看似简单,实则危险:
- 属性真实存在但值就是
undefined,会误判为“不存在” - 对象是
null或undefined时,直接抛TypeError - 访问可能触发 getter,带来意外副作用
Object.keys(obj).includes('key') 同样不合适:
- 只检查可枚举的自有属性,漏掉不可枚举属性(如
toJSON)和原型链上的属性 - 每次调用都生成新数组,性能差,不适合高频操作
按需选择,不靠直觉
想确认“这个 key 是不是对象自己定义的”?→ Object.hasOwn()
想确认“我能不能通过 obj.key 拿到值”?→ 'key' in obj
别用值来回答结构问题,也别让兼容性绑架清晰性。现代开发中,Object.hasOwn 应该成为检查自有属性的默认选择。

















