for...in遍历对象时默认包含自身及原型链的可枚举属性,需用hasownproperty()筛选自身属性;更推荐object.keys()、reflect.ownkeys()等现代api替代。

使用 for...in 遍历对象时,默认会遍历**自身可枚举属性 + 原型链上所有可枚举属性**。要只遍历对象自身的属性,必须配合 hasOwnProperty() 方法做筛选。
用 hasOwnProperty() 过滤原型属性
hasOwnProperty() 是 Object.prototype 上的方法,用于判断某属性是否为对象**自身拥有**(而非继承自原型)。这是最常用、最可靠的方式:
const parent = { a: 1, b: 2 };
const child = Object.create(parent);
child.c = 3;
child.d = 4;
for (const key in child) {
if (child.hasOwnProperty(key)) {
console.log(key); // 只输出 'c', 'd'
}
}
注意:不能用 for...of 或 for...of + Object.keys()
for...in 本身不能跳过原型属性,而 for...of 不能直接遍历普通对象(会报错)。若想避开原型,更推荐替代方案:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
用
Object.keys(obj)+for...of:只返回自身可枚举字符串键,天然不包含原型属性 -
用
Object.getOwnPropertyNames(obj):返回自身所有字符串键(含不可枚举的,如constructor) -
用
Reflect.ownKeys(obj):返回自身所有键(含 Symbol 类型)
避免误判:hasOwnProperty 可能被覆盖
如果对象自身定义了同名属性 hasOwnProperty,直接调用会出错。安全写法是显式从 Object.prototype 调用:
const obj = {
hasOwnProperty: 'oops',
name: 'Alice'
};
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
console.log(key); // 正确输出 'name'
}
}
现代开发中更推荐的替代方式
除非需要兼容极老环境或必须用 for...in(比如遍历不确定结构的“类字典”对象),否则优先选择更明确、更安全的方式:
- 遍历自身可枚举属性 →
for (const key of Object.keys(obj)) { ... } - 遍历所有自身键(含 Symbol)→
for (const key of Reflect.ownKeys(obj)) { ... } - 需要同时取值 →
Object.entries(obj).forEach(([k, v]) => { ... })
不复杂但容易忽略。核心就一条:for...in 必须配 hasOwnProperty 才安全;更推荐用 Object.keys 等现代 API 替代。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










