object.hasown 是 es2022 引入的安全方法,用于准确判断对象是否自有某属性;它规避了 hasownproperty 被覆盖的风险,比 in 操作符更精确,且语义清晰、性能更优。

Object.hasOwn 是 ES2022 引入的原生方法,用于安全、准确地判断对象是否**自有**(即非继承)某个属性。它比 obj.hasOwnProperty(prop) 更可靠,也比 prop in obj 更精确——后者会检查原型链,而 Object.hasOwn 只关注对象自身。
避免 hasOwnProperty 被覆盖的风险
老写法 obj.hasOwnProperty('x') 有个隐患:如果对象本身定义了同名属性(比如 { hasOwnProperty: false }),调用就会出错或返回错误结果。而 Object.hasOwn 是静态方法,不依赖对象内部状态。
- ✅ 安全:无论对象有没有重写
hasOwnProperty,Object.hasOwn(obj, 'key')都能正常工作 - ❌ 不推荐:
obj.hasOwnProperty?.('key')虽加了可选链,仍无法解决被覆盖时语义错误的问题
精准区分自有属性和继承属性
检查对象“当前状态”时,常需排除原型上的默认值。例如组件配置对象继承自基类,但只关心用户显式设置的字段:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
'id' in obj→ 返回true即使id来自原型 -
Object.hasOwn(obj, 'id')→ 只有obj.id = 123或obj['id'] = 123这类直接赋值才返回true
替代 in 操作符做存在性校验
在条件渲染、表单校验、配置合并等场景中,判断字段是否被显式设置比单纯“是否存在”更重要:
- 表单提交前检查:
if (Object.hasOwn(formData, 'email')) { /* 用户填了邮箱 */ } - 配置合并逻辑:
const finalConfig = { ...defaultConfig, ...(Object.hasOwn(custom, 'timeout') ? { timeout: custom.timeout } : {}) };
兼容性与降级建议
现代浏览器和 Node.js ≥ 16.9 已原生支持。若需支持旧环境,可用简单 polyfill:
Object.hasOwn ??= Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty);
注意不要用 Object.prototype.hasOwnProperty.call(obj, key) 直接替代——虽然功能等价,但 Object.hasOwn 更语义清晰、性能略优,且是标准推荐方式。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










