判断属性是否存在需区分范围:查整个原型链用in操作符,查对象自身用object.hasown(),避免用obj.key !== undefined;定位直接原型需组合!object.hasown(obj, key)与object.getprototypeof(obj)?.hasownproperty(key)。

判断属性是否存在于对象及其原型链,关键在于明确你要查的范围:是“只要能读到就算”,还是“必须是对象自己定义的”。不同目标对应不同方法,选错容易引发隐性 bug。
查整个原型链(包括自身)用 in 操作符
这是最直接的方式,语法简洁,语义清晰——“这个 key 能不能通过 obj.key 访问到?”
- 返回
true只要属性名出现在对象自身,或任意一级原型上(比如'toString' in {}是true) - 不区分可枚举性,不可枚举属性也能被检测到
- 不关心值是什么,哪怕值是
undefined或null,只要属性存在就返回true - 兼容性极好,所有环境都支持
只查对象自身属性用 Object.hasOwn()
这是现代 JS 推荐的标准做法,专门回答“这个属性是不是对象自己定义的?”
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 完全忽略原型链,
Object.hasOwn({}, 'toString')返回false - 能检测不可枚举属性(比如用
Object.defineProperty设置的enumerable: false属性) - 比
obj.hasOwnProperty('key')更安全:不怕对象自身覆盖了hasOwnProperty方法 - Node.js 16.9+、主流浏览器均已支持;旧环境可用
Object.prototype.hasOwnProperty.call(obj, key)回退
别用 obj.key !== undefined 判断存在性
这不是检查“是否存在”,而是在检查“值是否不等于 undefined”,逻辑上就错了。
- 属性真实存在但值为
undefined,会误判为“不存在” - 如果
obj是null或undefined,这行代码直接抛TypeError - 访问时可能触发 getter,带来意外副作用
- 真要判断值是否已设置且非
undefined,应单独处理,而不是混同存在性检测
需要定位“是否在直接原型上”得组合判断
既不是自身,又不是整条原型链,而是紧挨着的那一层原型,就得手动分步确认:
- 先排除自身:
!Object.hasOwn(obj, key) - 再查直接原型是否有该属性:
Object.getPrototypeOf(obj)?.hasOwnProperty(key) - 注意:
key in Object.getPrototypeOf(obj)不够准,因为它仍会继续向上查原型链
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










