object.hasown 是直接调用 object.prototype.hasownproperty 原始实现的引擎级快捷方法,严格校验参数类型,只检测自有属性、支持 symbol 键、不触发 getter,且绕过原型链干扰。

Object.hasOwn 不是靠遍历或反射实现的,它直接调用 Object.prototype.hasOwnProperty 的原始内置实现,但绕过了目标对象的原型链干扰。
它本质上是引擎层面的快捷入口,等价于 Object.prototype.hasOwnProperty.call(obj, prop),但省去了手动绑定和防御性处理。
只查自有属性,不碰原型链
无论 obj 的原型上有没有同名属性、obj 是否重写了 hasOwnProperty 方法、甚至 obj 是 Object.create(null) 创建的空对象,Object.hasOwn(obj, key) 都能正确返回结果。
因为它根本没调用 obj.hasOwnProperty,而是固定从 Object.prototype 拿原始方法执行。
参数校验严格,拒绝“假装是对象”的值
传入 null、undefined、字符串、数字等非对象类型时,会立即抛出 TypeError。这不是 bug,而是设计使然——该方法语义明确:只用于对象自有属性检测,原始值本就不该参与这个逻辑。
支持 Symbol 键,且行为一致Object.hasOwn(obj, Symbol('id')) 和 Object.hasOwn(obj, 'name') 一样可靠。底层对键的类型不做特殊转换,直接按引用或字面量比对,和 hasOwnProperty 原始行为完全对齐。
不触发 getter,也不读取属性值
它只检查属性是否存在(即内部 [[OwnPropertyKeys]] 或 [[HasProperty]] 机制),不会访问 obj[key],因此不会意外执行 getter、不会引发副作用、也不会因 undefined 值误判。
- 它不是靠
obj[key] !== undefined判断 - 不依赖
in操作符(后者查整个原型链) - 也不等同于
Reflect.has(obj, key)(后者行为类似in)
现代 JavaScript 引擎(V8、SpiderMonkey、JavaScriptCore)在实现上直接复用原有 hasOwnProperty 的底层逻辑,只是调用路径更干净、更可控。











