in运算符用于检测属性名是否存在于对象自身或原型链上,返回布尔值;它只关心键是否存在,不依赖属性值,且能安全探测浏览器API支持情况。

in 运算符用于检测某个属性名(字符串)是否存在于对象自身或其原型链上,它不关心属性值是什么,只看“键”是否存在。
in 运算符的基本用法
语法很简单:"propertyName" in object,返回布尔值。
- 只要属性名在对象自身或任意一层原型上存在,就返回
true - 即使属性值为
null、undefined或false,只要键存在,结果仍是true - 对数组使用时,检测的是索引(字符串形式),例如
"0" in arr检查第一个元素是否存在
区分自有属性与继承属性
in 无法区分属性来自对象自身还是原型。若需判断是否为自有属性,应配合 hasOwnProperty():
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
"toString" in {}→true(继承自Object.prototype) -
{}.hasOwnProperty("toString")→false(不是自有属性) -
"length" in []→true(Array.prototype提供)
探测浏览器特性支持的实用场景
常用于安全地检测 API 是否可用,避免运行时报错:
立即学习“Java免费学习笔记(深入)”;
-
"fetch" in window判断是否支持原生fetch -
"localStorage" in window检查本地存储是否可用 -
"IntersectionObserver" in window判断是否支持懒加载相关 API - 注意:某些环境(如旧版 IE)中
window上的全局变量可能未定义,in 可以安全探测而不会抛错
注意事项和常见误区
容易被忽略但关键的细节:
- 左侧必须是字符串字面量或能转为字符串的表达式;
obj in obj是语法错误 - 对
null或undefined使用会抛出 TypeError,务必确保右侧是对象 - 不能检测
Symbol属性(除非显式传入 Symbol 值,且该 Symbol 已被定义在对象上) - 与
obj.prop !== undefined不同:in 包含 `in` 操作本身,后者会触发 getter 并可能产生副作用

















