hasOwnProperty方法专用于判断属性是否为对象自身拥有而非继承,值为undefined也不影响结果;被覆盖时应使用Object.prototype.hasOwnProperty.call();现代推荐用Object.hasOwn()替代。

JavaScript 中 hasOwnProperty 方法专用于判断一个属性是否为对象“自身拥有”,即该属性直接定义在对象上,而非从原型链继承而来。它不关心属性值是什么(哪怕是 undefined),只回答“这个键是不是对象自己声明的”。这是它和 in、obj.key !== undefined 等方式最本质的区别。
只查对象自己定义的属性
当你需要确认某个 key 是不是开发者显式写进对象字面量或通过 obj.key = value 添加的,就该用 hasOwnProperty。它会忽略原型上的同名属性,避免误判。
-
let obj = { a: 1 };→obj.hasOwnProperty('a')返回true -
obj.__proto__.b = 2;→obj.hasOwnProperty('b')返回false(尽管obj.b能访问到) -
obj.c = undefined;→obj.hasOwnProperty('c')仍返回true(值是undefined不影响存在性)
不能直接调用时的稳妥写法
如果对象自身覆盖了 hasOwnProperty 方法(比如 { hasOwnProperty: () => false }),直接调用会出错或返回错误结果。此时应借用 Object.prototype 上的原始方法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
Object.prototype.hasOwnProperty.call(obj, 'key')替代obj.hasOwnProperty('key') - 这种写法绕过对象自身的属性查找,直接使用原生实现,更可靠
- 适用于需兼容老旧环境或处理不可信对象的场景
与 Object.hasOwn() 的关系
Object.hasOwn(obj, 'key') 是 hasOwnProperty 的现代替代方案,语义更清晰、调用更安全:
立即学习“Java免费学习笔记(深入)”;
- 行为完全一致:只检查对象自身属性
- 不依赖对象原型,不怕被篡改(如
obj.hasOwnProperty = null) - Node.js 16.9+ 和主流浏览器已原生支持;旧环境可用 polyfill 回退
- 推荐新项目优先使用
Object.hasOwn(),老代码可逐步迁移
不适合的场景要避开
它不是万能钥匙,用错地方反而引入 bug:
- 想判断“能否读取到某个值”(含继承属性)?→ 改用
'key' in obj - 想检测属性值是否为真值?→ 用
obj.key != null或明确比较,但注意这不是“存在性检查” - 需要遍历所有可枚举自有属性?→ 用
Object.keys(obj),而不是反复调用hasOwnProperty - 检查 Symbol 属性?→
hasOwnProperty支持 Symbol 类型参数,没问题

















