hasOwnProperty 是自ES1起定义在Object.prototype上的标准实例方法,用于判断对象自身是否拥有指定键的属性,不查原型链、支持Symbol、不触发getter/setter;ECMA-262第14版推荐使用更安全的Object.hasOwn()替代。

标准定位与规范依据
根据 ECMA-262 第 14 版(2023)第 20.1.3.2 节,`Object.prototype.hasOwnProperty` 的规范要求如下:
- 接收一个参数
propertyKey,类型为String或Symbol; - 返回
true当且仅当对象自身(不含原型链)拥有该键对应的属性(无论是否可枚举、是否为undefined); - 不访问或触发 getter/setter,仅基于内部属性表([[OwnPropertyKeys]])判断存在性;
- 若调用者不是对象(如
null或undefined),会抛出TypeError; - 方法本身不可被枚举(
enumerable: false),但可通过继承获得。
关键合规行为
符合规范的实现必须满足:
-
只查自身:严格区分自有属性与继承属性。例如:
{}.hasOwnProperty('toString')返回false(toString来自Object.prototype); -
支持 Symbol 键:
const obj = { [Symbol('a')]: 1 }; obj.hasOwnProperty(Symbol('a'))应返回true; -
不依赖值:即使
obj.prop = undefined,obj.hasOwnProperty('prop')仍为true; -
可被覆盖但不应被篡改语义:规范允许用户重写该方法,但不保证其行为——这正是它被
Object.hasOwn()取代的根本原因。
与标准演进的关系
尽管 hasOwnProperty 本身仍是标准一部分,但规范已明确推荐更安全的替代方案:
- ECMA-262 第 14 版新增
Object.hasOwn(obj, key)(第 20.1.3.10 节),并标注为“preferred overhasOwnPropertyfor checking own properties”; - 规范强调:
hasOwnProperty的调用方式(obj.hasOwnProperty(...))存在运行时不确定性,而Object.hasOwn是静态、不可覆盖、参数校验更严格的标准化入口; - 所有主流引擎(V8、SpiderMonkey、JavaScriptCore)均已按规范实现二者,并将
Object.hasOwn视为现代代码的合规首选。
实际开发中的合规建议
要确保代码符合标准精神与长期可维护性:
立即学习“Java免费学习笔记(深入)”;
- 避免直接调用
obj.hasOwnProperty(key),尤其在不可信对象来源场景(如用户输入构造的对象、第三方库返回值); - 若需兼容 ES2021 及更早环境,应使用
Object.prototype.hasOwnProperty.call(obj, key)—— 这是规范认可的安全兜底写法; - 新项目应默认启用
Object.hasOwn,并在构建配置(如 Babel +@babel/preset-env)中按目标环境自动降级; - TypeScript 用户需确认
lib配置包含es2022或更高版本,以获得Object.hasOwn的完整类型定义支持。


















