不推荐用 for...in 遍历数组,因其遍历字符串索引并沿原型链查找可枚举属性,导致顺序不确定、污染干扰及类型错误;应改用 for...of 或传统 for 循环。

不推荐用 for...in 遍历数组——它不是设计来干这事的,表面能跑,背后埋雷。
for...in 本质是遍历对象的可枚举属性名
JavaScript 中数组也是对象,for...in 会把数组当普通对象处理:它遍历的是“键”(即索引),而且是字符串类型的键(比如 "0"、"1"),不是数字。更关键的是,它会顺着原型链一路往下找,把 Array.prototype 上所有可枚举的属性和方法也一并列出来。
- 你写
Array.prototype.sum = function() { return this.reduce((a,b) => a+b, 0); } - 再用
for (let i in [1,2,3]) { console.log(i); } - 输出可能是:
"0"、"1"、"2"、"sum"
常见隐藏 Bug 场景
这些错误往往上线后才暴露,调试时很难第一时间联想到 for...in:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 页面渲染列表多出
undefined—— 因为遍历到了原型上的函数,取arr["sum"]是undefined - 数值计算出错 —— 索引是字符串,
i + 1变成字符串拼接("0" + 1 → "01") - 遍历顺序不保证 —— 尤其当数组混有数字索引和自定义属性时,引擎可能打乱顺序
- 扩展了第三方库(如 Prototype.js)后,全局 Array 原型被污染,所有
for...in数组循环集体失效
为什么加 hasOwnProperty 也不够稳妥
有人会说:“加个 if (arr.hasOwnProperty(i)) 不就过滤掉原型上的东西了吗?”理论上可行,但实际仍有风险:
- 如果别人把属性设为可枚举且在数组实例上直接添加(比如
arr.customFlag = true),它会被遍历到,也可能干扰逻辑 - 索引仍是字符串,做数学运算仍需
parseInt(i)或+i,徒增出错概率 - 语义错位:你本意是“遍历元素”,却在写“遍历键名+手动取值”,代码可读性和维护性下降
该用什么替代
按场景选更安全、更直白的方式:
- 要逐个取值 → 用
for...of:for (const item of arr) { console.log(item); } - 需要索引和值 → 用传统
for循环:for (let i = 0; i - 想函数式编程 → 用
arr.forEach()、arr.map()等原生方法 - 兼容老环境(如 IE11)→ 老实写
for (let i = 0; ...),稳定可靠










