in运算符沿原型链查找属性名,不区分自有或继承;先查对象自身,再逐级向上至Object.prototype,只要键存在即返回true,用于判断属性可用性而非值有效性。

in 运算符在 JavaScript 中检测属性时,天然就沿着原型链向上查找——它不区分属性是对象自己有的,还是从原型“借来”的。
in 运算符的查找机制:从自身到原型链顶端
当你写 'prop' in obj,JavaScript 会按以下顺序检查:
- 先看
obj自身有没有名为prop的属性(自有属性) - 如果没有,就去
obj.__proto__(即构造函数的prototype)里找 - 如果还没找到,继续顺着
__proto__链往上查,比如obj.__proto__.__proto__ - 一直查到
Object.prototype;再往上是null,查找终止
只要在这一整条链上任何一环找到了该属性名,in 就返回 true。
一个直观的例子
假设这样定义:
function Person() {}
Person.prototype.say = function() {};
const p = new Person();
此时:
-
'say' in p→ true(say在Person.prototype上) -
p.hasOwnProperty('say')→ false(p自身没定义say) -
'toString' in p→ true(toString在Object.prototype上)
为什么设计成这样?
in 的定位不是“这个对象私有啥”,而是“我能不能用这个属性或方法”。比如判断一个对象是否支持 .forEach 或 .map,你并不关心它是数组实例自己带的,还是从 Array.prototype 继承来的——只要能调用就行。这种“可用性检查”正是 in 的核心用途。
注意:只查属性名,不看值
即使某个属性值是 undefined、null 或 0,只要名字存在,in 仍返回 true:
-
const obj = { a: undefined }; 'a' in obj→ true -
const obj2 = {}; obj2.__proto__.b = undefined; 'b' in obj2→ true
它判断的是“键是否存在”,不是“值是否有效”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











