in操作符检查对象自身及原型链上所有属性(含不可枚举),返回true;hasOwnProperty仅检测自有属性;Object.hasOwn是ES2022新增、更安全的自有属性检查方法。

in 操作符会检查原型链上的属性,包括实例自身和原型链上所有可枚举(无论是否可枚举)的属性。
in 操作符:查整个原型链
只要属性存在于对象本身,或其任意一级原型上(包括 Object.prototype),in 都返回 true。
- 它不区分自有属性还是继承属性
- 即使属性是不可枚举的(比如通过 Object.defineProperty 设置 enumerable: false),in 依然能检测到
- 例子:
let obj = { a: 1 }; console.log('toString' in obj); // true(来自 Object.prototype)
hasOwnProperty:只查实例自有属性
这是最常用、最直接的方式,专门用来判断属性是否为对象**自身拥有**(不查原型链)。
- 返回布尔值,只关心“是不是我自己的”,不关心是否可枚举
- 注意:它是一个方法,必须通过 obj.hasOwnProperty(prop) 调用
- 为避免被重写,推荐用 Object.prototype.hasOwnProperty.call(obj, prop)
Object.hasOwn(ES2022 新增):更安全的自有属性检查
现代推荐方式,语义清晰、无需担心原型污染或方法被覆盖。
- 语法简洁:Object.hasOwn(obj, prop)
- 内部实现等价于 Object.prototype.hasOwnProperty.call,但更可靠
- 尚未在极旧环境(如 IE)支持,但主流浏览器和 Node.js 16.9+ 均可用
for...in + hasOwnProperty 组合:遍历并过滤自有属性
如果想列出所有**可枚举的自有属性**,常用这个组合:
- for...in 会遍历自身 + 原型链上所有可枚举属性
- 配合 hasOwnProperty 或 Object.hasOwn 过滤,就能只保留实例自身的
- 例子:
for (let key in obj) { if (Object.hasOwn(obj, key)) { console.log(key); } }

















