in操作符检查属性是否存在于对象及其原型链中,hasOwnProperty只检查对象自身属性;Object.hasOwn是ES2022推荐的更安全替代方案。

in 操作符检查属性是否存在于对象(包括原型链)中,hasOwnProperty 只检查对象自身是否拥有该属性(不查原型链)。
in 操作符:查整个原型链
只要属性名在对象本身或其任意一级原型上存在,in 就返回 true。
- 语法简单:
'prop' in obj - 对
undefined或null会报错,需确保左操作数是对象 - 即使属性值为
undefined,只要键存在,结果仍是true
例如:
Object.prototype.b = 2;
console.log('a' in obj); // true
console.log('b' in obj); // true(来自原型)
console.log('c' in obj); // false
hasOwnProperty:只查对象自身
这是对象原型上的方法,严格判断属性是否直接定义在该对象上,不沿原型链查找。
立即学习“Java免费学习笔记(深入)”;
- 必须通过方法调用:
obj.hasOwnProperty('prop') - 推荐用
Object.prototype.hasOwnProperty.call(obj, 'prop')避免对象自身重写了该方法 - 同样,属性值是否为
undefined不影响结果,只看键是否存在
例如:
let obj = { a: 1 };Object.prototype.b = 2;
console.log(obj.hasOwnProperty('a')); // true
console.log(obj.hasOwnProperty('b')); // false(来自原型)
console.log(obj.hasOwnProperty('toString')); // false(来自 Object.prototype)
常见误用与建议
- 遍历对象时,用
hasOwnProperty过滤掉继承属性(如for...in循环中) - 判断“对象是否真正配置了某个字段”,优先用
hasOwnProperty - 仅需知道“这个键能否被访问到”,比如做存在性兜底,
in更合适 - ES2022 新增的
Object.hasOwn(obj, prop)是hasOwnProperty的推荐替代,更安全、无需 call 绑定


















