object.hasown是es2022引入的安全替代方法,用于准确判断对象自身是否拥有某属性而不查找原型链;它规避了hasownproperty在null原型对象或被覆盖时的错误,统一语法、支持symbol、返回布尔值且无副作用。

Object.hasOwn 是 ES2022 引入的原生方法,用于安全判断对象自身是否拥有某个属性,它比 in 操作符和 hasOwnProperty 更可靠,尤其能避开原型链上同名属性带来的误判。
为什么 hasOwnProperty 不够安全
hasOwnProperty 是 Object.prototype 上的方法,如果目标对象自身定义了同名属性(比如 obj.hasOwnProperty = false),调用 obj.hasOwnProperty(key) 就会出错或返回错误结果。即使没被覆盖,用 call 方式调用也略显繁琐:
- ❌ 不安全写法: obj.hasOwnProperty('x') —— 可能因属性被覆盖而失效
- ✅ 勉强安全但啰嗦: Object.prototype.hasOwnProperty.call(obj, 'x')
- ✅ 推荐替代: Object.hasOwn(obj, 'x') —— 直接、简洁、防篡改
Object.hasOwn 和 in 的核心区别
in 检查的是整个属性查找路径(自身 + 原型链),而 Object.hasOwn 只检查对象自身属性,不沿原型链向上查找:
- ❌ in 会误报: 'toString' in {} 返回 true(来自 Object.prototype)
- ✅ Object.hasOwn 正确排除: Object.hasOwn({}, 'toString') 返回 false
- 适合判断“这个对象自己是不是真有这个键”,比如遍历前过滤掉继承来的属性
实际使用场景示例
常见于配置合并、浅拷贝、序列化前校验等需要严格区分自有属性的场合:
- 遍历对象并只处理自有属性:
for (const key in obj) { if (Object.hasOwn(obj, key)) { /* 处理 key */ } } - 安全读取可选属性:
if (Object.hasOwn(config, 'timeout')) { use(config.timeout); } - 避免 Object.create(null) 场景下 hasOwnProperty 失效问题 —— Object.hasOwn 对 null 原型对象也完全兼容
不复杂但容易忽略:只要你想确认“这个属性是不是对象自己定义的”,就该优先用 Object.hasOwn,它既语义清晰,又规避了历史包袱。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











