应使用 hasownproperty 方法或 object.keys() 过滤原型链属性;hasownproperty 显式检查自有属性,object.keys() 天然返回可枚举自有属性键名,二者均避免 for...in 遍历继承属性。

使用 hasOwnProperty 方法过滤,只处理对象自身属性。
用 hasOwnProperty 做显式检查
这是最常用、最直接的方式。在 for...in 循环体内加一层判断,确保只遍历对象**自有属性**(即非继承自原型链的属性):
- 写法示例:
const obj = { a: 1, b: 2 };<br>obj.__proto__.c = 3; // 在原型上添加属性(不推荐,仅作演示)<br><br>for (const key in obj) {<br> if (obj.hasOwnProperty(key)) {<br> console.log(key, obj[key]); // 只输出 a 和 b<br> }<br>}
用 Object.keys() 配合 for...of
Object.keys() 返回的数组**只包含可枚举的自有属性键名**,天然避开原型链。再配合 for...of 更安全清晰:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 避免了
for...in对原型属性的意外访问 - 语义更明确:你就是想遍历这个对象“自己有的键”
- 代码更现代、可读性更强
for (const key of Object.keys(obj)) {<br> console.log(key, obj[key]); // 同样只输出 a 和 b<br>}
注意:for...in 本身无法禁用原型遍历
for...in 的设计机制决定了它会遍历整个原型链上**可枚举(enumerable: true)的属性**,无法通过配置或修饰符跳过。所以必须靠逻辑过滤(如 hasOwnProperty)或换用更精准的 API(如 Object.keys、Object.getOwnPropertyNames)来达成目标。
进阶提示:区分 own 和 enumerable
有两个独立概念常被混淆:
- Own property:该属性直接定义在对象上(不是从原型继承)
-
Enumerable property:该属性的
enumerable描述符为true(默认是true,但可通过Object.defineProperty设为false)
hasOwnProperty 只管“是否自有”,不管“是否可枚举”;而 Object.keys 同时要求“自有 + 可枚举”。若需遍历所有自有属性(包括不可枚举的),用 Object.getOwnPropertyNames()。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










