Object.hasOwn 是 ES2022 引入的安全、语义明确的静态方法,用于准确判断对象自身是否拥有指定属性,避免 hasOwnProperty 被覆盖风险,兼容主流环境并适用于输入校验与解构防护。

Object.hasOwn 是 ES2022 引入的原生方法,用于安全、明确地判断对象自身是否拥有指定属性(不查找原型链)。相比传统的 obj.hasOwnProperty(prop),它规避了被覆盖风险,语义更清晰,是现代 JavaScript 中推荐的属性存在性检测方式。
避免 hasOwnProperty 被意外覆盖的风险
老写法 obj.hasOwnProperty(prop) 依赖对象自身或其原型链上的 hasOwnProperty 方法。但若对象本身定义了同名属性(如 { hasOwnProperty: true }),或原型被篡改,调用就会失败甚至报错。
而 Object.hasOwn(obj, prop) 是静态方法,完全不依赖目标对象的任何属性或原型,彻底杜绝此类隐患。
- ✅ 安全:即使
obj = { hasOwnProperty: 'fake' },Object.hasOwn(obj, 'hasOwnProperty')仍返回true - ❌ 危险:
obj.hasOwnProperty('hasOwnProperty')在上例中会报TypeError: obj.hasOwnProperty is not a function
语义更准确,明确区分“自有属性”与“继承属性”
开发者常误用 prop in obj 判断属性是否存在,但它会命中原型链上的属性(如 toString),导致逻辑偏差。而 Object.hasOwn 的命名和行为直指核心:只关心对象“自己拥有”的属性。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
- ✔️ 想知道是否为对象显式定义的属性?用
Object.hasOwn(obj, 'key') - ⚠️ 用
'key' in obj可能返回true,即使该属性来自Object.prototype - ⚠️ 用
obj.key !== undefined不可靠——属性值可能就是undefined
兼容性好,可平滑替代旧模式
目前所有主流浏览器(Chrome 93+、Firefox 92+、Safari 15.4+)及 Node.js 16.9+ 均原生支持。对旧环境,可用简单 polyfill:
if (!Object.hasOwn) {
Object.hasOwn = Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty);
}
该 polyfill 行为与原生一致,且比手动写 Object.prototype.hasOwnProperty.call(obj, prop) 更简洁、可读性更强。
适合校验用户输入、配置对象与解构前检查
在处理外部数据(如 API 响应、表单提交)时,用 Object.hasOwn 判断关键字段是否存在,能提前拦截结构异常,避免运行时错误。
- 例如解析用户数据:
if (Object.hasOwn(userData, 'email') && Object.hasOwn(userData, 'name')) { ... } - 再如配置合并:
if (Object.hasOwn(customConfig, 'timeout')) { use customConfig.timeout } - 解构前防护:
const { id } = Object.hasOwn(data, 'id') ? data : { id: null };

















