in操作符检查属性名是否存在于对象及其原型链中,不区分自有或继承属性,也不关心枚举性;对undefined/null会报错,与hasOwnProperty只查自有属性形成对比。

在 JavaScript 中,in 操作符用于检查某个属性名是否存在于对象(包括其原型链)中,它不区分自有属性还是继承属性,只要能在整个原型链上找到该属性名,就返回 true。
in 操作符的基本行为
in 检查的是“属性名是否存在”,而不是属性值是否为真或是否可访问。它会沿着原型链向上查找,直到 Object.prototype 或 null 为止。
- 即使属性值为
undefined,只要属性名存在,'prop' in obj仍为 true - 对
undefined或null使用in会报错,需确保左操作数是对象 -
in对数组也有效,例如'length' in [1,2,3]返回 true(length是数组的自有属性)
与 hasOwnProperty 的关键区别
obj.hasOwnProperty(prop) 只检查对象自身的属性,不沿原型链查找;而 prop in obj 会查原型链。
- 例如:
toString in {}→ true(继承自Object.prototype) - 但:
{}.hasOwnProperty('toString')→ false - 若想只检查自有属性,用
hasOwnProperty;若要包含继承属性,用in
实际使用时的注意事项
注意属性是否被设置为不可枚举——in 不关心枚举性,哪怕属性 enumerable: false,只要存在,in 依然返回 true。
立即学习“Java免费学习笔记(深入)”;
- 例如:
Object.defineProperty(obj, 'hidden', { value: 42, enumerable: false }),之后'hidden' in obj仍是 true -
for...in循环才受enumerable控制,in不受影响 - 避免误判:不要用
in判断属性是否有值,而应结合obj[prop] !== undefined或obj.hasOwnProperty综合判断
原型链上属性的典型来源
常见继承来的属性包括:toString、valueOf、constructor、hasOwnProperty 等,它们都来自 Object.prototype;数组还有 push、map 等来自 Array.prototype。
-
'push' in []→ true(来自Array.prototype) -
'toFixed' in 123→ true(数字包装对象继承自Number.prototype) -
'then' in Promise.resolve()→ true(来自Promise.prototype)


















