判断对象属性是否存在需据场景选择方法:查自身且对象可信用hasownproperty;不可信时用object.hasown();查自身及原型链用in或reflect.has();仅查可枚举自身属性用object.keys().includes()。

判断对象属性是否存在,关键看两点:是否要查原型链、对象是否可能篡改内置方法。安全的核心是避免误判和运行时错误。
查自身属性且对象可信 → 用 hasOwnProperty
适用于普通对象(如字面量、new Object()),能准确区分自有属性和继承属性。
- 直接调用:
obj.hasOwnProperty('key') - 注意:如果对象自己定义了
hasOwnProperty属性(比如{ hasOwnProperty: () => false }),会覆盖原型方法,导致结果不可靠
查自身属性但对象不可信 → 用 Object.hasOwn()
这是 ES2022 正式引入的推荐方案,专为解决 hasOwnProperty 被覆盖的问题而生。
- 语法简洁:
Object.hasOwn(obj, 'key') - 不依赖对象原型,完全绕过
obj.hasOwnProperty的风险 - 兼容性良好(现代浏览器及 Node.js ≥16.9.0)
查自身 + 原型链属性 → 用 in 或 Reflect.has()
两者行为一致,都返回 true 只要属性存在于对象本身或任意一级原型上。
-
'key' in obj:简洁直观,支持动态属性名(变量) -
Reflect.has(obj, 'key'):函数式写法,适合封装或动态调用场景 - 注意:
in对null或undefined会报错,使用前需确保对象存在
只查可枚举自身属性 → 用 Object.keys().includes()
适合明确只要可枚举(即 for…in 能遍历到)的自有属性,比如做配置校验、表单字段检查。
Object.keys(obj).includes('key')- 缺点:无法检测不可枚举属性(如
Object.defineProperty(obj, 'x', { enumerable: false })) - 优点:语义清晰,不会受原型链干扰
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











