in运算符检查属性是否存在于对象自身或原型链中,hasownproperty()仅检查对象自身属性;object.hasown()是es6推荐的更安全替代方案。

检测 JavaScript 对象中属性是否存在,in 运算符和 hasOwnProperty() 是两个常用但行为不同的方法。关键区别在于:前者查**整个原型链**,后者只查**对象自身**。
用 in 检测属性(含继承)
in 运算符返回 true 只要属性名存在于对象本身或其任意原型上,不管值是不是 undefined。
- 语法简单:
'prop' in obj - 对
undefined、null等假值也有效(只要属性名存在) - 会沿原型链向上查找,比如
'toString' in {}返回true(来自Object.prototype) - 不能区分是自有属性还是继承属性
用 hasOwnProperty() 检测自有属性
obj.hasOwnProperty('prop') 只检查对象**自身是否声明了该属性**,不访问原型链。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 返回
true仅当属性在对象自身上(哪怕值为undefined) - 注意:它不是全局函数,是每个对象从
Object.prototype继承的方法 - 如果对象的原型链上重写了
hasOwnProperty,可能出错;稳妥写法是Object.prototype.hasOwnProperty.call(obj, 'prop') - ES6 起也可用
Object.hasOwn(obj, 'prop')(推荐替代,更安全且支持null/undefined)
实际使用建议
选哪个取决于你想回答的问题:
- “这个对象能响应
.prop吗?” → 用in(比如判断是否支持某个方法) - “这个属性是我自己加上的,还是从原型来的?” → 用
hasOwnProperty或Object.hasOwn - 需要兼容老环境且担心原型污染?优先用
Object.prototype.hasOwnProperty.call(obj, key) - 新项目或支持现代浏览器?直接用
Object.hasOwn(obj, key),语义清晰、安全、可读性好
一个对比示例
(以下代码可直接在控制台运行)
const parent = { a: 1 };
const child = Object.create(parent);
child.b = 2;
'a' in child; // true(继承自 parent)
'b' in child; // true(自身有)
'c' in child; // false
child.hasOwnProperty('a'); // false(a 不是 child 自身的)
child.hasOwnProperty('b'); // true
child.hasOwnProperty('c'); // false
Object.hasOwn(child, 'a'); // false
Object.hasOwn(child, 'b'); // true
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










