Object.hasOwn 是 ES2022 引入的静态方法,用于安全、简洁地判断对象自身是否拥有指定属性(不查找原型链),避免 hasOwnProperty 被覆盖风险,语义比 'in' 更精准,支持 null/undefined 输入,语法统一且适合函数式编程与 TypeScript 类型推导。

Object.hasOwn 是 ES2022 引入的静态方法,用于安全、简洁地判断对象自身是否拥有指定属性(不查找原型链)。相比传统的 'prop' in obj 或 obj.hasOwnProperty('prop'),它在静态调用场景下更可靠、更直观。
避免 hasOwnProperty 被覆盖的风险
老写法 obj.hasOwnProperty('key') 依赖实例方法,但该方法可能被意外覆盖或缺失(例如 Object.create(null) 创建的对象没有该方法):
-
不安全:
const obj = { hasOwnProperty: null }; obj.hasOwnProperty('x') → TypeError -
安全:
Object.hasOwn(obj, 'x') → false,完全绕过实例状态
比 'in' 操作符语义更精准
'key' in obj 会沿原型链查找,而 Object.hasOwn 只检查**自身属性**,意图明确:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const obj = Object.assign(Object.create({ y: 1 }), { x: 2 });-
'x' in obj → true,'y' in obj → true(含继承) -
Object.hasOwn(obj, 'x') → true,Object.hasOwn(obj, 'y') → false(仅自身)
支持 null/undefined 输入,无需额外防护
该方法对非对象参数有明确定义行为(返回 false),省去类型校验:
立即学习“Java免费学习笔记(深入)”;
Object.hasOwn(null, 'x') → falseObject.hasOwn(undefined, 'x') → false-
Object.hasOwn(42, 'toString') → false(数字不是对象,无自身属性)
语法统一,适合函数式与工具库风格
作为纯静态方法,它天然适配高阶函数、工具封装和 TypeScript 类型推导:
const keysOfOwn = (obj) => Object.keys(obj).filter(k => Object.hasOwn(obj, k));- TypeScript 中可精确标注:
Object.hasOwn(obj, key as keyof typeof obj) - 比
Reflect.has更聚焦——后者仍查原型链,且语义偏“是否存在可访问”,而非“是否为自身属性”

















