推荐用 object.hasown 而不是 obj.hasownproperty,核心原因在于它从设计上消除了传统方法的几处关键隐患:不依赖原型链、避开覆盖风险、支持 null/undefined、语义清晰且调用直接。

推荐用 Object.hasOwn 而不是 obj.hasOwnProperty,核心原因在于它从设计上消除了传统方法的几处关键隐患,底层更稳定、调用更直接、语义更清晰。
不依赖对象原型链,彻底避开覆盖风险
hasOwnProperty 是挂载在 Object.prototype 上的实例方法,所有普通对象都通过原型链继承它。但一旦对象自身定义了同名属性(比如 obj.hasOwnProperty = null 或 obj.hasOwnProperty = () => false),原方法就被静默覆盖,调用会报错或返回错误结果。
-
Object.hasOwn是静态方法,只通过Object构造器调用,完全绕过目标对象的任何属性和原型干扰 - 即使对象是
Object.create(null)创建的(没有原型),也能安全使用 - 第三方数据(如 JSON 解析结果、用户传入对象)无需预判结构,直接检测即可
天然支持 null / undefined,无需额外判空
对 null 或 undefined 调用 obj.hasOwnProperty() 会立即抛出 TypeError;而 Object.hasOwn(null, 'key') 或 Object.hasOwn(undefined, 'key') 稳定返回 false,符合“不存在即为 false”的直觉逻辑。
- 省去常见兜底写法:
obj && obj.hasOwnProperty && obj.hasOwnProperty(key) - 避免因漏判空导致运行时崩溃,尤其在处理可选参数、API 响应字段时更鲁棒
语义统一,调用方式更直观
hasOwnProperty 的调用主体是对象本身,容易让人误以为“这是该对象的能力”;但实际上它的行为取决于原型链状态,存在语义误导。
-
Object.hasOwn(obj, key)明确表达“我让 Object 来检查这个 obj”,主谓宾清晰 - 参数顺序与常用工具函数(如
Object.keys、Object.values)风格一致,降低认知负担 - 不需要记忆
Object.prototype.hasOwnProperty.call(obj, key)这种冗长写法
现代环境已广泛支持,降级成本低
Chrome 93+、Firefox 92+、Safari 15.4+、Edge 93+ 和 Node.js 16.9+ 均原生支持。旧环境可通过轻量 polyfill 或构建工具自动转换。
- Babel 配合
@babel/preset-env可按目标浏览器自动降级为Object.prototype.hasOwnProperty.call - TypeScript 项目只需确保
lib包含es2022即可获得完整类型提示 - ESLint 启用
no-prototype-builtins规则能自动识别并提醒不安全的hasOwnProperty调用











