Object.hasOwn 是 ES2022 引入的安全方法,用于准确判断对象是否拥有自有属性;它避免了 hasOwnProperty 被覆盖或缺失的问题,语法为 Object.hasOwn(obj, propKey),返回布尔值,推荐在需确认属性是否直接定义于对象自身时优先使用。

Object.hasOwn 是 ES2022 引入的原生方法,用于准确判断一个对象是否**自有(own)属性**,即该属性直接定义在对象自身上,而非继承自原型链。它比 obj.hasOwnProperty(prop) 更安全、更可靠,尤其在对象可能覆盖或丢失 hasOwnProperty 方法时(比如 Object.create(null) 创建的对象)。
为什么不用 hasOwnProperty?
hasOwnProperty 是 Object.prototype 上的方法,所有普通对象都继承它。但存在几个问题:
- 对象可能重写或删除自己的
hasOwnProperty方法,导致调用失败或行为异常 -
Object.create(null)创建的对象没有原型,因此根本没有hasOwnProperty - 需要显式绑定(
obj.hasOwnProperty.call(obj, 'key'))才能安全使用,写法冗长
Object.hasOwn 的基本用法
语法简单直观:Object.hasOwn(obj, propKey),返回布尔值。
-
obj:要检测的目标对象 -
propKey:字符串或 Symbol 类型的属性名
示例:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
立即学习“Java免费学习笔记(深入)”;
const proto = { a: 1 };<br>const obj = Object.assign(Object.create(proto), { b: 2, c: 3 });<br><br>Object.hasOwn(obj, 'a'); // false —— a 在原型上<br>Object.hasOwn(obj, 'b'); // true —— b 是 obj 自有属性<br>Object.hasOwn(obj, 'c'); // true —— c 是 obj 自有属性<br>Object.hasOwn(obj, 'toString'); // false —— 继承自 Object.prototype
与 in 操作符、Object.prototype.hasOwnProperty 的对比
in 检查的是**整个原型链**,包括继承属性;hasOwnProperty 检查自有属性但有前述缺陷;Object.hasOwn 是两者的理想替代:
-
'a' in obj→true(因为可继承) -
obj.hasOwnProperty('a')→ 可能报错或返回错误结果(如 obj 无原型) -
Object.hasOwn(obj, 'a')→ 安全、语义清晰、返回预期结果
实际使用建议
日常开发中,只要想确认“这个属性是不是直接挂在当前对象上的”,就优先用 Object.hasOwn:
- 遍历对象前过滤掉原型属性:
Object.keys(obj).filter(key => Object.hasOwn(obj, key))(其实Object.keys本身只返回自有可枚举属性,但配合Object.getOwnPropertyNames或Object.getOwnPropertySymbols时需注意) - 处理用户传入的任意对象(尤其可能来自 JSON 或第三方库)时,避免因原型污染或方法缺失导致崩溃
- 替代
obj[prop] !== undefined这类不严谨的检查(因为属性值可能是undefined)

















