in运算符检测属性名是否存在于对象自身或原型链上,返回布尔值;它不区分属性来源,仅判断存在性而非值真假或可枚举性。

in 运算符用于检测指定的属性名(字符串)是否存在于对象自身或其原型链上。
语法很简单:`key in object`
返回布尔值:
- 如果对象自身或其任意原型上有该属性名(即使是 undefined),结果为 true;
- 如果完全找不到,返回 false。
注意:它检测的是“属性名是否存在”,不是“属性值是否为真值”或“是否可枚举”。
区分自身属性和继承属性
in 不区分属性来源,只要在原型链上就返回 true。例如:
```js
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
```
若只想检查**自身属性**(不包括原型),应改用 Object.hasOwn(obj, key)(ES2022+)或兼容写法 Object.prototype.hasOwnProperty.call(obj, key)。
常见易错点
- 属性名必须是字符串或能转为字符串的值(如数字、Symbol);
obj[1] === obj['1'],所以1 in obj等价于'1' in obj - 不能检测未声明变量:
'x' in x会报ReferenceError;安全做法是先确保对象存在,或用typeof obj !== 'undefined' && 'x' in obj - 对
null或undefined使用会报错,需提前判断类型 - 数组也是对象,
'length' in arr返回true,'0' in arr在有索引 0 时为true(即使值为undefined)
和其它检测方式对比
- obj.key !== undefined:可能误判(属性值恰好是 undefined)
- obj[key] !== undefined:同样无法区分“不存在”和“存在但值为 undefined”
- Object.hasOwn(obj, key):只查自身,更精确,推荐用于明确需要排除原型的情况
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











