in运算符检测属性是否存在于对象自身或原型链中,hasownproperty只检测对象自身属性;二者配合可准确区分属性归属:'prop' in obj && !obj.hasownproperty('prop')表示来自原型链,obj.hasownproperty('prop')表示在自身上,!('prop' in obj)表示都不存在。

用 in 和 hasOwnProperty 配合,就能明确区分一个属性是对象自己有的,还是从原型链继承来的。
in 运算符:查整条原型链
in 只关心“是否存在”,不管在哪——自身有、原型上有、甚至 Object.prototype 上有,它都返回 true。
- 语法简单:
'prop' in obj - 对值为
undefined的属性也返回 true(只看键,不看值) - 数组中检测的是索引,不是元素值;比如
0 in [1,2]是 true,'length' in [1,2]也是 true
hasOwnProperty:只认对象自身
obj.hasOwnProperty('prop') 返回 true,说明这个属性确实定义在 obj 这个对象上,没走原型链。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 它忽略所有继承来的属性,哪怕原型上同名属性很常用(如
toString、valueOf) - 即使属性被设为不可枚举,只要在自身上,它仍返回 true
- 注意不要直接写
hasOwnProperty('prop'),容易因this指向出错;稳妥写法是Object.prototype.hasOwnProperty.call(obj, 'prop')
组合判断:三句话分清归属
单靠一个方法不够,搭配使用才准确:
-
'prop' in obj && !obj.hasOwnProperty('prop')→ 属性一定来自原型链 -
obj.hasOwnProperty('prop')→ 属性一定在对象自身上 -
!('prop' in obj)→ 属性在自身和原型链上都不存在
实际场景中的典型用法
最常见的是 for...in 遍历时过滤掉原型属性:
- 错误写法(会遍历到
toString等):for (let k in obj) { ... } - 正确写法:
if (obj.hasOwnProperty(k)) { ... } - 更健壮写法:
const hasOwn = Object.prototype.hasOwnProperty; for (let k in obj) { if (hasOwn.call(obj, k)) { ... } }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










