类数组对象需满足有length属性且索引为0开始的非负整数键,转换为真数组才能使用forEach等方法;推荐Array.from,兼容性佳;for循环最通用,for...in不适用。

类数组对象本身不能直接用数组方法遍历,必须先转成真数组,或用兼容类数组的遍历方式。关键不在“怎么遍历”,而在“怎么让遍历可行”——核心是解决类型适配问题。
哪些对象算类数组?
只要满足两个条件:有 length 属性,且索引是 0 开始的非负整数键(如 0、1、2),就是类数组。典型例子包括:
-
arguments对象(函数内) -
document.querySelectorAll()或document.getElementsByTagName()返回的 NodeList(部分版本) - 手动构造的对象:
{0: 'a', 1: 'b', length: 2}
转换成真数组的主流方法
转成数组后,就能自由使用 forEach、map、filter 等所有数组方法。
-
Array.from(arrayLike):最推荐,语义清晰,支持映射函数(第二个参数可加工元素) -
[...arrayLike](展开运算符):简洁,但要求对象是可迭代的(现代 NodeList、HTMLCollection 通常满足) -
Array.prototype.slice.call(arrayLike):兼容老环境(IE),原理是借用slice的索引遍历逻辑,依赖length和数字键
不转换、直接遍历的替代方案
如果只是读取或简单操作,不一定非要转数组:
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
-
for循环:最通用,直接用arrayLike[i]+arrayLike.length,无兼容性问题 -
for...of:对可迭代类数组(如现代 NodeList)有效,但对纯对象类数组(如{0:'a',length:1})会报错 -
Array.prototype.forEach.call(arrayLike, callback):不建新数组,复用原生方法,但写法略冗长
注意事项
避免踩坑比选方法更重要:
-
for...in不适用——它遍历的是属性名(字符串),且会枚举原型链上的可枚举属性,结果不可控 - 手动构造类数组时,
length必须准确,否则转换后可能截断或补undefined - 某些 DOM 集合(如
HTMLCollection)在旧浏览器中不可迭代,[...]会失败,此时优先用Array.from或slice.call










