应避免用 for...in 遍历数组,因其会遍历原型链属性且不保证顺序;推荐使用 for、for...of 或 foreach 等专为数组设计的方法。

直接用 for、for...of 或数组方法(如 forEach)替代 for...in,就能避开绝大多数问题。核心在于:for-in 是为对象设计的,不是为数组。
for-in 会遍历原型链上的属性
只要有人给 Array.prototype 添加了方法(比如 Array.prototype.remove 或 Array.prototype.searchItem),for...in 就会把那个方法名当作“索引”遍历出来,导致多执行一次、访问 array['remove'] 得到函数而非元素,甚至报错。
这不是小概率事件——很多老库(如 Prototype.js)就大量扩展原生 Array,一旦混用,bug 隐蔽且难定位。
解决办法很简单:
- 别用
for...in遍历数组,哪怕它“看起来能跑通” - 如果非得用(极不推荐),必须加
hasOwnProperty过滤:for (let i in arr) { if (arr.hasOwnProperty(i)) { /* 处理 arr[i] */ } }
for-in 不保证遍历顺序
规范明确指出,for...in 的遍历顺序不固定。对数组来说,你期望按 0, 1, 2... 顺序处理,但它可能返回 2, 0, 1,尤其在含稀疏索引或混合属性时更明显。
这对依赖顺序的逻辑(如累加、渲染列表、状态同步)是致命的。
安全做法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用传统
for (let i = 0; i —— 索引可控、顺序确定 - 用
for...of—— 直接遍历值,天然按数组顺序,且不关心索引
for-in 返回的是字符串类型的键,不是数值索引
写 for (let i in [10, 20, 30]),i 是 "0"、"1"、"2" 这样的字符串,不是数字。如果后续误当数字做运算(比如 i + 1),结果会变成 "01" 而非 1,引发静默错误。
而 for...of 和 forEach 直接给值;传统 for 中的 i 是明确声明的数字变量,类型清晰。
建议统一使用:
-
for...of:简洁、安全、现代,适合只关心元素值的场景 -
forEach:语义清晰,适合纯副作用操作(如 DOM 更新、日志打印) -
for循环:需要索引、需中途break/continue、或性能敏感时首选
哪些情况看似“能用”,其实埋雷
有人测试过:for (let i in [1,2,3]) { console.log(arr[i]) } 确实输出了 1 2 3。但这只是因为当前环境没扩展 Array 原型、且数组是致密的。
这种“侥幸通过”的代码最危险——它在开发环境正常,上线后因引入某个第三方脚本突然崩溃,而且毫无征兆。
记住一个判断标准:只要代码要给别人用、要长期维护、要和其他库共存,就绝对不要用 for-in 遍历数组。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










