object.hasown是es2022引入的静态方法,用于安全检测对象自有属性;hasownproperty是依赖原型链的实例方法,存在被覆盖、null/undefined报错及原型污染风险。

Object.hasOwn 是 ES2022 引入的原生方法,用于安全地判断对象自身是否拥有某个属性,它比传统的 obj.hasOwnProperty(prop) 更可靠,尤其在对象原型被篡改或 hasOwnProperty 被覆盖时依然有效。
为什么 hasOwnProperty 不够安全
hasOwnProperty 是继承自 Object.prototype 的方法,如果原型链被污染(比如有人执行了 Object.prototype.hasOwnProperty = null 或重写了该方法),调用 obj.hasOwnProperty(prop) 就会出错或返回错误结果。即使对象自身没定义该方法,也会因原型失效而无法正常工作。
- 常见风险场景:第三方库误改原型、恶意代码注入、旧版 polyfill 冲突
- 无法直接在 null/undefined 上调用(会报错),而
Object.hasOwn可以安全处理 null/undefined(直接返回false)
Object.hasOwn 的正确用法
语法简单明确:Object.hasOwn(obj, prop),第一个参数是目标对象,第二个是属性名(字符串或 Symbol)。
- 支持所有类型对象,包括
null和undefined(自动返回false) - 只检查对象自身的属性,不查找原型链上的属性
- 与
prop in obj不同——后者会查找整个原型链,而Object.hasOwn更精准
对比示例:安全 vs 不安全
假设有人篡改了原型:
Object.prototype.hasOwnProperty = () => false; // 恶意覆盖
const obj = { a: 1 };
此时:
-
obj.hasOwnProperty('a')→false(错误!) -
'a' in obj→true(但会误判继承属性) -
Object.hasOwn(obj, 'a')→true(正确且健壮) -
Object.hasOwn(null, 'a')→false(不抛错,安全)
实际开发建议
在需要精确判断“对象自身是否有某属性”的场景中,优先使用 Object.hasOwn:
- 遍历对象前校验属性存在性(如配置项检查、API 响应字段校验)
- 写工具函数或通用库时,避免依赖可能被覆盖的原型方法
- TypeScript 中注意:需确保 target 为 ES2022+,否则需启用
lib: ["es2022"]或添加 polyfill
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











