for-in循环遍历对象自身及原型链上可枚举的字符串键属性,不保证顺序,需用hasownproperty过滤继承属性;忽略symbol键,数字键转为字符串;禁止循环中修改对象,推荐object.keys等替代方案。

for-in 循环用于遍历对象自身及其原型链上**可枚举的字符串键属性**,但它不保证遍历顺序,也不适合遍历数组(应优先用 for-of 或 forEach)。使用时需注意过滤掉继承属性,避免意外操作。
只遍历对象自身的可枚举属性
for-in 会遍历整个原型链上的可枚举属性,容易误读到 Object.prototype 上的方法(如 toString、hasOwnProperty)。推荐用 hasOwnProperty() 做过滤:
const obj = { a: 1, b: 2 };
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key, obj[key]); // 输出:a 1,b 2
}
}注意属性键始终是字符串类型
即使对象使用 Symbol 或数字作为键,for-in 只处理**字符串类型的可枚举键**。Symbol 键不会出现,数字键会被自动转为字符串:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
const obj = {
42: 'answer',
'name': 'js',
[Symbol('id')]: 123
};
for (let key in obj) {
console.log(typeof key); // 全是 "string"
console.log(key); // 输出 "42" 和 "name",不输出 Symbol 键
}避免在 for-in 中修改正在遍历的对象
在循环中添加、删除或重定义属性可能导致行为不可预测(例如跳过属性、重复遍历),尤其在不同引擎中表现不一致。如需修改,建议先收集键名再操作:
- 用 Object.keys(obj) 获取自有可枚举字符串键数组
- 用 for-of 或 forEach 安全遍历并修改
- 若必须用 for-in,先缓存所有要处理的 key:
const keys = Object.keys(obj); for (const k of keys) { /* 修改 obj[k] */ }
替代方案更安全、语义更清晰
现代开发中,多数场景有更优选择:
- Object.keys(obj):仅自身可枚举字符串键(返回数组,可链式操作)
- Object.getOwnPropertyNames(obj):包含不可枚举字符串键(不含 Symbol)
- Object.getOwnPropertySymbols(obj):获取自身 Symbol 键
- Reflect.ownKeys(obj):返回所有自身键(字符串 + Symbol),顺序与定义一致
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










