最可靠的方法是使用 object.prototype.hasownproperty() 或 object.hasown();前者兼容性好但需用 call 调用防遮蔽,后者是 es2022 新增、更安全且支持 symbol 键。

在 JavaScript 中,检测对象自身属性(即非原型链继承的属性)是否存在,最可靠的方法是使用 Object.prototype.hasOwnProperty() 或 Object.hasOwn()(ES2022 新增)。
用 hasOwnProperty() 检测自身属性
hasOwnProperty() 是最经典、兼容性最好的方式。它只检查对象自身是否拥有该属性,不查找原型链:
- 返回
true表示属性存在于对象自身(即使值为null、undefined或false) - 注意:该方法可能被覆盖或遮蔽,建议用
Object.prototype.hasOwnProperty.call(obj, key)调用更安全
例如:
const obj = { name: 'Alice', age: 30 };obj.hasOwnProperty('name'); // true
obj.hasOwnProperty('toString'); // false(来自 Object.prototype)
Object.prototype.hasOwnProperty.call(obj, 'age'); // true(推荐写法)
用 Object.hasOwn() 更现代、更安全
Object.hasOwn() 是 hasOwnProperty() 的标准化替代方案(2022 年纳入标准),不会被对象自身属性遮蔽,且语义更清晰:
- 无需担心对象重写了
hasOwnProperty - 支持 Symbol 类型键
- 目前主流浏览器和 Node.js ≥16.9 已支持
例如:
const obj = { [Symbol('id')]: 123 };Object.hasOwn(obj, 'name'); // true
Object.hasOwn(obj, Symbol('id')); // true
避免用 in 操作符或 obj[key] !== undefined
in 操作符会查找整个原型链,无法区分自身与继承属性;而 obj[key] !== undefined 会误判值为 undefined 的自身属性:
-
'toString' in obj返回true(但它是继承来的) -
obj.prop === undefined无法区分“属性不存在”和“属性存在但值为undefined”
需要遍历所有自身属性时用 Object.keys() 或 Object.getOwnPropertyNames()
如果目标是枚举自身属性,而不是单个检测:
-
Object.keys(obj):返回可枚举自身字符串键数组 -
Object.getOwnPropertyNames(obj):返回所有自身字符串键(含不可枚举) -
Object.getOwnPropertySymbols(obj):返回所有自身 Symbol 键
再配合 includes() 可间接判断存在性,但不如 hasOwn 直接高效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











