in运算符用于判断属性名是否存在于对象自身或原型链上,返回布尔值;检测的是属性名而非值,会沿原型链查找,对null/undefined抛错,与hasOwnProperty()的区别在于后者仅检查自身属性。

in 运算符用于判断指定的属性名(字符串)是否存在于对象自身或其原型链上,返回布尔值。
基本语法和行为
写法是 propName in object,其中 propName 必须是字符串(或可转为字符串的值),object 是目标对象。
- 检测的是“属性名”,不是属性值;即使属性值为
undefined,只要该属性存在,结果就是true - 会沿原型链向上查找,包括继承来的属性(比如
"toString" in {}返回true) - 对
null或undefined使用会抛出错误,需确保右侧是有效对象
与 Object.prototype.hasOwnProperty() 的区别
in 检查整个原型链,而 hasOwnProperty() 只检查对象自身的属性:
-
"name" in obj→true(如果name在自身或原型上) -
obj.hasOwnProperty("name")→true(仅当name是obj自身属性) - 例如:
"toString" in {}是true,但{}.hasOwnProperty("toString")是false
常见使用场景和注意事项
适合快速判断某属性是否“可用”,尤其在不确定属性是否被定义、又不关心是否为继承属性时:
立即学习“Java免费学习笔记(深入)”;
- 检查浏览器 API 是否支持:
"fetch" in window、"localStorage" in window - 判断配置对象中是否有某个选项:
"timeout" in config - 注意:不能用它检测数组索引是否存在(如
0 in arr虽然语法合法,但易误解;更推荐用arr.length > 0或arr[0] !== undefined) - 属性名要加引号或确保是字符串——
name in obj会先尝试读取变量name的值,不是字面量属性名
简单示例
const obj = { a: 1 };
Object.prototype.b = 2; // 添加到原型
console.log("a" in obj); // true(自有)
console.log("b" in obj); // true(继承)
console.log("c" in obj); // false
console.log("hasOwnProperty" in obj); // true(从 Object.prototype 继承)


















