in运算符检查属性名是否存在于对象自身或原型链中,返回布尔值;它不区分自有与继承属性,对null/undefined会报错,且无法判断值是否为undefined。

in 运算符用于检查**某个属性名是否存在于对象本身或其原型链上**(包括继承的属性),只要属性可枚举或不可枚举,只要存在就返回 true。
语法和基本行为
写法是:propertyName in object,其中 propertyName 必须是字符串(或可转为字符串的值),object 是目标对象。
- 返回布尔值:
true表示该属性名在对象自身或任意上级原型中存在(即使值为undefined) - 不区分自有属性和继承属性 —— 只要链上某处有这个键名,就为
true - 对
null或undefined使用会抛出错误,需先确保对象有效
和 hasOwnProperty() 的关键区别
in 看的是整个原型链,而 hasOwnProperty() 只查对象自身:
const parent = { a: 1 };
const child = Object.create(parent);
child.b = 2;
console.log('a' in child); // true(从 parent 继承)
console.log(child.hasOwnProperty('a')); // false(自身没有 a)
console.log('b' in child); // true(自身有 b)
console.log(child.hasOwnProperty('b')); // true
常见使用场景与注意事项
- 适合做“是否存在某能力”的宽泛判断,比如检查浏览器 API 是否可用:
'fetch' in window - 不能判断属性值是否为
undefined—— 即使obj.prop === undefined,只要属性存在,'prop' in obj仍为true - 对数组慎用:
'length' in arr为true,但'0' in arr在稀疏数组中可能为false(如let a = []; a[5] = 1;,则'0' in a是false) - 符号(Symbol)属性也支持:
const sym = Symbol('key'); const obj = {[sym]: 1}; console.log(sym in obj); // true
替代方案对比(按用途选)
- 只查自身属性 → 用
Object.prototype.hasOwnProperty.call(obj, key)或Object.hasOwn(obj, key)(ES2022+ 推荐) - 想确认属性存在且值非
undefined→ 直接访问并判断:obj.key !== undefined(注意:无法区分undefined值和未定义属性) - 获取所有自身可枚举属性 →
Object.keys(obj) - 获取所有自身属性(含不可枚举)→
Object.getOwnPropertyNames(obj)


















