Object.hasOwn()是ES2022引入的标准方法,用于准确判断对象自身是否拥有某属性,避免hasOwnProperty被覆盖或in操作符检查原型链的问题,推荐优先使用。

JavaScript 中没有原生的 hasOwn 方法,但自 ES2022 起,Object.hasOwn() 已成为标准方法,用于替代容易出错的 obj.hasOwnProperty(prop) 和不够安全的 prop in obj。它能准确判断对象自身是否拥有某属性(不包括原型链上的属性),且不会因对象覆盖 hasOwnProperty 方法而失效。
为什么不用 hasOwnProperty?
老写法 obj.hasOwnProperty(prop) 看似直观,但存在两个隐患:
- 如果对象自己定义了
hasOwnProperty属性(比如{ hasOwnProperty: false }),调用会失败或返回错误结果; - 若对象原型链上重写了
hasOwnProperty(极少见但可能),行为不可靠。
为什么不用 in 操作符?
prop in obj 检查的是“对象及其原型链中是否存在该属性”,无法区分是自身属性还是继承属性。例如:
const obj = { a: 1 };
console.log('toString' in obj); // true(来自 Object.prototype)
这在需要严格判断“是否为对象自有属性”时(如序列化、深拷贝、权限校验)会导致误判。
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
正确使用 Object.hasOwn()
这是目前最推荐的方式,兼容性已覆盖主流环境(Chrome 93+、Firefox 92+、Safari 15.4+、Node.js 16.9+)。用法简单直接:
-
Object.hasOwn(obj, 'key')—— 返回布尔值; - 第一个参数必须是对象(非对象会自动转为
Object,但通常应确保传入有效对象); - 第二个参数为字符串或可转为字符串的值(如数字
0、Symbol)。
示例:
const obj = { name: 'Alice', __proto__: { age: 30 } };
Object.hasOwn(obj, 'name'); // true
Object.hasOwn(obj, 'age'); // false(age 在原型上)
Object.hasOwn(obj, 'toString'); // false(来自原型链)
兼容旧环境的稳妥写法
若需支持较老运行时(如 Node.js <16.9 或 IE),可用以下降级方案:
const hasOwn = Object.hasOwn || Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty); // 使用方式不变 hasOwn(obj, 'key');
该写法利用 Function.prototype.bind 和 call,确保即使对象篡改了 hasOwnProperty,也能安全调用原型方法。
不复杂但容易忽略:属性存在性检查不是语法糖,而是数据完整性与逻辑健壮性的基础环节。用 Object.hasOwn() 替代旧模式,几行代码就能避开潜在陷阱。

















