for...in用于遍历对象可枚举属性,包括继承属性,需用hasOwnProperty过滤自身属性;遍历数组时不保证顺序且会遍历非数字键,建议使用for...of或forEach;key始终为字符串类型,Symbol属性不会被遍历。

在JavaScript中,for...in语句用于遍历对象的可枚举属性,包括自身和继承的属性。虽然语法简单,但在实际使用中容易踩坑,尤其在处理数组或不同类型对象时需格外注意。
只遍历对象的可枚举属性
for...in会遍历对象所有可枚举的属性,包括从原型链上继承的属性。这意味着如果父级原型添加了可枚举方法或属性,它们也会被遍历到。
建议:使用 hasOwnProperty() 方法过滤出对象自身的属性,避免意外访问继承属性。示例:
const obj = { a: 1, b: 2 };
Object.prototype.extra = function() {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key); // 只输出 a 和 b
}
}
不要用 for...in 遍历数组索引
尽管数组也是对象,for...in可以遍历数组的索引,但存在几个问题:
- 遍历顺序不保证,可能不是按数字顺序
- 会遍历所有可枚举属性,包括手动添加的非数字键
- 性能不如 for 或 for...of
错误示例:
系统功能强大、操作便捷并具有高度延续开发的内容与知识管理系统,并可集合系统强大的新闻、产品、下载、人才、留言、搜索引擎优化、等功能模块,为企业部门提供一个简单、易用、开放、可扩展的企业信息门户平台或电子商务运行平台。开发人员为脆弱页面专门设计了防刷新系统,自动阻止恶意访问和攻击;安全检查应用于每一处代码中,每个提交到系统查询语句中的变量都经过过滤,可自动屏蔽恶意攻击代码,从而全面防止SQL注入攻击
const arr = [10, 20, 30];
arr.customProp = 'bad idea';
for (let index in arr) {
console.log(arr[index]); // 会输出 10, 20, 30, 'bad idea'
}
属性类型始终是字符串
for...in中的键(key)总是字符串类型,即使遍历的是数组,index 也是字符串而非数字。
注意:在进行数学运算时要显式转换为数字,避免隐式类型转换错误。例如:
for (let key in obj) {
typeof key; // "string"
}
Symbol 属性不会被遍历
for...in只能遍历字符串键的可枚举属性,Symbol 类型的键会被跳过。
如果需要获取所有键(包括 Symbol),应结合 Object.getOwnPropertySymbols() 使用。 基本上就这些。合理使用 for...in,重点注意属性来源、类型和用途场景,避免误用。









