for-in循环遍历对象自身及原型链所有可枚举属性,需用hasOwnProperty过滤以排除继承属性;标准写法为obj.hasOwnProperty(key),更安全写法是Object.prototype.hasOwnProperty.call(obj, key),现代推荐Object.keys()。

在 JavaScript 中,for-in 循环会遍历对象**自身及其原型链上所有可枚举的属性**。如果只想处理对象自身的属性(排除从 Object.prototype 或其他父级原型继承来的属性),需要用 hasOwnProperty() 做过滤。
为什么需要 hasOwnProperty 过滤
JavaScript 对象属性查找机制会沿原型链向上查找。比如给 Object.prototype 添加一个方法(不推荐但常见于老代码),所有对象用 for-in 都会遍历到它:
Object.prototype.customMethod = function() {};const obj = { name: 'Alice' };for (let key in obj) { console.log(key); }
→ 输出:"name" 和 "customMethod"(意外!)
标准写法:用 hasOwnProperty 判断是否为自有属性
在循环体内,对每个 key 调用 obj.hasOwnProperty(key),只处理返回 true 的属性:
- 必须用
obj.hasOwnProperty(key),不能直接写hasOwnProperty(key)(避免 this 指向错误) - ES5+ 推荐更安全的写法:
Object.prototype.hasOwnProperty.call(obj, key),防止对象自身重写了hasOwnProperty - 现代替代方案:可用
Object.keys(obj)配合for-of,天然只遍历自有可枚举属性
实际示例对比
带过滤的 for-in(推荐):
立即学习“Java免费学习笔记(深入)”;
const person = { name: 'Tom', age: 30 };for (let key in person) {
if (person.hasOwnProperty(key)) {
console.log(key, person[key]); // 只输出 name 和 age
}}
更健壮的写法(防覆盖):
const hasOwn = Object.prototype.hasOwnProperty;for (let key in person) {
if (hasOwn.call(person, key)) {
// 安全处理
}}
注意:for-in 不适合遍历数组
for-in 是为普通对象设计的,它不保证顺序,且会遍历数组的非数字键(如自定义属性、方法)。遍历数组请用 for、for-of、forEach 等。


















