in操作符检查属性名是否存在于对象自身或原型链中,返回布尔值,不关心属性值、可枚举性或自有性;与hasownproperty不同,它遍历整个原型链,且对null/undefined报错。

in 操作符会检查一个属性名是否存在于对象自身或其原型链上的任意一层,只要存在就返回 true,无论该属性是否可枚举、是否为自有属性。
in 检查的是“属性名”,不是“属性值”
它只关心键(字符串)是否存在,不关心值是什么,也不关心是否为 undefined:
-
'toString' in {}→true(继承自Object.prototype) -
'length' in []→true(数组自有属性) -
'foo' in { foo: undefined }→true(自有属性存在,值为undefined) -
'bar' in { foo: 42 }→false
in 与 hasOwnProperty 的关键区别
in 查整个原型链;obj.hasOwnProperty(prop) 只查对象自身:
-
'toString' in {}→true,但{}.hasOwnProperty('toString')→false -
'push' in []→true(来自Array.prototype),[].hasOwnProperty('push')→false - 若只想确认是否为“自有属性”,必须用
hasOwnProperty或Object.hasOwn(obj, prop)(ES2022 推荐)
in 对 null 和 undefined 报错,需提前校验
in 要求右侧操作数是对象(包括数组、函数、包装对象等),否则抛出 TypeError:
-
'x' in null→ 报错 -
'x' in undefined→ 报错 - 安全写法:
obj != null && 'x' in obj,或封装成工具函数
in 不受属性描述符影响,不可枚举属性也能被检测到
即使属性被设为 enumerable: false,in 仍能查到:
const obj = {}; Object.defineProperty(obj, 'hidden', { value: 1, enumerable: false });-
'hidden' in obj→true -
Object.keys(obj)→[](不可枚举,所以不出现)
不复杂但容易忽略:in 是原型链感知的成员检测,不是值判断,也不是自有性断言。用对场景,才能避免误判。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











