Object.hasOwn 是轻量级原生方法,直接读取对象自身属性描述符,O(1) 时间复杂度,无原型遍历、无 getter 触发、无副作用,性能优于 Object.prototype.hasOwnProperty.call。

不会引发额外计算。
Object.hasOwn 是一个轻量级的原生方法,它的内部实现直接读取对象自身的属性描述符(own property descriptor),不遍历原型链、不触发 getter、不执行任何用户定义逻辑。它本质上是引擎底层对对象内部结构的一次常数时间(O(1))查询,和访问 Object.prototype.hasOwnProperty 的原始行为一致,但绕过了所有中间代理和原型查找开销。
关键点在于:
- 它不调用任何可被覆盖的方法,也不依赖
this绑定或原型链查找; - 不做类型转换(比如把 Symbol 自动转成字符串),传入什么就查什么;
- 对非对象参数(如
null、undefined)直接抛出TypeError,这个判断在入口处完成,开销极小; - 没有副作用,不会改变对象状态,也不会触发 Proxy 的
has或get拦截。
对比传统写法更省事:
// 旧方式:需手动绑定,多一层函数调用 + this 绑定 + 原型查找 Object.prototype.hasOwnProperty.call(obj, key) // 新方式:直击本质,一步到位 Object.hasOwn(obj, key)
现代 JS 引擎(V8、SpiderMonkey、JavaScriptCore)已将其优化为接近内联的底层操作,实际性能与 in 操作符相当,甚至略优——因为 in 还要递归查原型链。
所以,放心用。它不是“语法糖”,而是更底层、更干净的属性存在性断言。


















