Object.hasOwn是ES2022引入的安全可靠方法,用于精准判断对象是否自有指定属性,替代易被覆盖的hasOwnProperty和不严谨的in操作符,语义清晰、调用简洁、不受原型干扰。

Object.hasOwn 是 ES2022 引入的原生方法,用来安全、明确地判断对象是否**自有属性**(即非继承属性)。相比传统的 obj.hasOwnProperty(prop) 或 prop in obj,它更可靠、语义更清晰,能直接提升代码可读性与健壮性。
避免 hasOwnProperty 被覆盖的风险
老写法 obj.hasOwnProperty(key) 依赖原型链上的方法,一旦对象自身定义了同名属性(比如 { hasOwnProperty: true }),就会出错或返回意外结果。Object.hasOwn 不依赖实例方法,完全绕过原型干扰。
- ✅ 安全:
Object.hasOwn({ hasOwnProperty: 42 }, 'hasOwnProperty')返回 true - ❌ 危险:
({ hasOwnProperty: 42 }).hasOwnProperty('hasOwnProperty')报 TypeError
语义比 in 操作符更精准
key in obj 检查的是“是否在对象或其原型链上存在”,而实际业务中多数场景只关心“这个属性是不是对象自己定义的”。用 Object.hasOwn 能让意图一目了然。
- 读代码时一眼看出:这里关注的是自有性,不是“是否存在”
- 例如校验配置对象字段:
if (Object.hasOwn(config, 'timeout')) { ... }比'timeout' in config更准确
替代 Object.prototype.hasOwnProperty.call 的繁琐写法
过去为规避覆盖风险,常写成 Object.prototype.hasOwnProperty.call(obj, key),冗长且不易理解。Object.hasOwn 是它的简洁、标准替代方案。
立即学习“Java免费学习笔记(深入)”;
- 旧写法:
Object.prototype.hasOwnProperty.call(user, 'email') - 新写法:
Object.hasOwn(user, 'email')—— 更短、更直白、更易维护
配合 TypeScript 和现代 Lint 规则效果更佳
TypeScript 5.0+ 原生支持 Object.hasOwn 类型推导;ESLint 的 no-prototype-builtins 规则也会推荐它作为 hasOwnProperty 的替代。统一使用后,团队代码风格更一致,新人更容易理解判断逻辑。
- 编辑器能更好提示类型,比如自动补全参数、标记未定义属性
- 静态检查可捕获
obj.hasOwnProperty这类潜在隐患调用
不复杂但容易忽略 —— 一个方法名的改变,就能让属性检查逻辑更可信、更易懂、更少出错。


















