in操作符检查属性是否存在于对象或其原型链中,返回布尔值;hasOwnProperty()仅检测自身属性;Object.hasOwn()是ES2022推荐的更安全高效替代方案;undefined判定不适用于存在性检测。

in 操作符:检查属性是否在对象或其原型链中
in 操作符会沿整个原型链查找属性,只要对象自身或任意原型上有该属性名,就返回 true。它不关心属性是否可枚举、是否为 undefined,只看“是否存在”。
例如:'toString' in {} 返回 true(来自 Object.prototype),而 'notExist' in {} 返回 false。
性能上,in 需要遍历原型链,深度越大开销越高;对普通对象(浅原型链)影响不大,但频繁用于深度继承结构时可能拖慢速度。
hasOwnProperty():仅检测对象自身属性
hasOwnProperty() 是最常用的自有属性检测方法,只检查对象自身,不访问原型链。
它比 in 更精准,也更轻量——无需遍历原型,直接查内部属性表。
注意:它是继承自 Object.prototype 的方法,若对象自身重写了该方法或原型被篡改(如 obj.hasOwnProperty = null),会出错。安全写法是用 Object.prototype.hasOwnProperty.call(obj, 'key')。
Object.hasOwn():ES2022 新增的推荐替代方案
Object.hasOwn() 是 hasOwnProperty() 的标准化升级版,语义更清晰、无需担心原型污染,且性能略优(V8 等引擎做了内建优化)。
它直接作为静态方法暴露,调用简洁:Object.hasOwn(obj, 'key')。
目前主流浏览器和 Node.js 16.9+ 均已支持;若需兼容旧环境,可用 polyfill 或回退到 call 方式。
undefined 判定(obj.prop !== undefined):不推荐的误用方式
用 obj.prop !== undefined 判断属性存在,逻辑上是错误的:
• 若属性存在但值恰好为 undefined,会误判为“不存在”;
• 若属性被 delete 或未声明,访问时虽得 undefined,但可能触发 getter 或报错(严格模式下对不可配置属性重复 delete);
• 更严重的是,若 obj 为 null 或 undefined,直接访问 prop 会抛 TypeError。
所以这不是存在性检测,而是值判断,且缺乏健壮性,应避免用于此目的。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











