object.hasown用于安全判断对象自有属性,避免继承干扰;比in更精准、比hasownproperty更可靠;适用于配置校验等需严格区分属性存在性的场景。

in 运算符和 Object.keys() 都能判断属性是否存在,但它们的职责、覆盖范围和适用场景完全不同。选错方法容易导致误判——比如把原型上的方法当成对象自有属性,或漏掉不可枚举属性。
in 运算符:查“能不能访问到”,含原型链
in 检查的是属性名是否能在对象(含其整个原型链)上被访问到,不区分来源,也不关心是否可枚举。
- 返回 true 的情况包括:对象自身属性、继承自 Object.prototype 的 toString、valueOf,甚至从自定义原型添加的方法
- 适合场景:做宽松的存在性检查,比如判断某个通用方法是否可用(
"forEach" in arr)、或兼容性兜底逻辑 - 注意:不能用于判断值是否存在,也不能反映属性是否属于对象“自己”
Object.keys():列“自己能枚举的键”,不含原型
Object.keys() 只返回对象自身的、可枚举的属性名数组,完全忽略原型链和不可枚举属性(如通过 Object.defineProperty 设置的 enumerable: false 的属性)。
- 适合场景:需要遍历或筛选对象“真实数据字段”时,比如表单序列化、配置项校验、JSON 安全导出
- 配合 includes() 可精准判断自有可枚举键:
Object.keys(obj).includes("name") - 不适用于检测不可枚举属性(如
arguments.callee)或 Symbol 键(需用 Object.getOwnPropertySymbols)
什么时候该用哪个?关键看三个维度
对照以下问题快速决策:
- 要包含原型上的属性?→ 用
in - 只关心对象自己定义的属性?→ 排除
in,优先考虑Object.keys()或更严格的Object.hasOwn() - 需要处理不可枚举属性或 Symbol?→ 改用
Object.getOwnPropertyNames()或Object.getOwnPropertySymbols() - 只是想安全地判断某个 key 是否为对象“自有”且“可枚举”?→
Object.keys(obj).includes(key)简洁可靠
现代替代建议:优先用 Object.hasOwn()
ES2022 引入的 Object.hasOwn(obj, prop) 是 obj.hasOwnProperty(prop) 的更安全替代,避免了原型污染风险,语义清晰,且性能更好。
- 它等价于
Object.keys(obj).includes(prop)的语义,但不创建新数组,也不受 hasOwnProperty 被覆盖的影响 - 推荐写法:
Object.hasOwn(obj, "id")→ 明确表达“这个 key 是 obj 自己的” - 兼容性注意:Node.js ≥16.9 / Chrome ≥93 / Firefox ≥97 / Safari ≥16.4,旧环境可加 polyfill
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











