for-in遍历对象所有可枚举的字符串键属性,包括自身和原型链上的;要只遍历自身属性需用hasownproperty过滤,或改用object.keys()等现代方法。

for-in 循环用于遍历对象的**可枚举属性**,包括自身属性和继承自原型链的属性。要只遍历对象自身的属性,必须配合 hasOwnProperty 方法过滤。
for-in 会遍历哪些属性?
for-in 遍历对象所有**可枚举(enumerable)的字符串键属性**,无论该属性定义在对象自身还是其原型上。例如:
const parent = { a: 1 };
Object.defineProperty(parent, 'b', { value: 2, enumerable: false });
const child = Object.create(parent);
child.c = 3;
<p>for (let key in child) {
console.log(key); // 输出 'c' 和 'a'(因为 a 可枚举且继承自 parent)
}
</p>
如何只遍历对象自身的可枚举属性?
用 hasOwnProperty 判断属性是否属于对象自身(而非原型链):
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 在循环体内加
if (obj.hasOwnProperty(key))条件判断 - 这是最常用、兼容性最好的方式,适用于所有环境
- 注意:不能用
obj[key] !== undefined或key in obj替代,它们无法区分自有和继承属性
现代替代方案(推荐用于新项目)
如果只需遍历自身可枚举属性,更清晰的方式是使用:
-
Object.keys(obj):返回自身可枚举属性的字符串数组,不包含 symbol 键 -
Object.getOwnPropertyNames(obj):返回自身所有属性名(含不可枚举),不含 symbol -
Object.getOwnPropertySymbols(obj):获取自身 symbol 属性 -
Reflect.ownKeys(obj):返回所有自身键(字符串 + symbol),ES2015+ 支持
例如:Object.keys(obj).forEach(key => { /* 处理 key */ });
注意事项
for-in 不保证遍历顺序(尤其对数字键),且会跳过不可枚举属性、symbol 属性、以及严格模式下某些内置属性。不要用它遍历数组 —— 应该用 for-of、forEach 或传统 for(let i=0;...)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










