for of 不能直接遍历类数组对象,因其缺少 Symbol.iterator 方法;可通过 Array.from()、扩展运算符[...arrayLike]或手动部署迭代器实现遍历,其中 Array.from() 最推荐。

for of 不能直接遍历类数组对象,因为类数组对象(如 arguments、NodeList、HTMLCollection 或手动构造的 {0: 'a', 1: 'b', length: 2})没有实现 Symbol.iterator 方法,而 for of 依赖该接口。
让类数组对象支持 for of 的三种常用方式
核心思路是:把类数组转成真正的可迭代对象(如 Array),或手动提供迭代器。
1. 使用 Array.from() 转为数组(推荐)
最简洁安全,兼容性好(ES6+),会真正拷贝一份新数组:
const arrayLike = {0: 'x', 1: 'y', 2: 'z', length: 3};
for (const item of Array.from(arrayLike)) {
console.log(item); // x → y → z
}
2. 使用扩展运算符 [...arrayLike]
写法更短,语义清晰,效果与 Array.from() 基本一致(也要求类数组有 length 和数字键):
立即学习“Java免费学习笔记(深入)”;
const list = document.querySelectorAll('div');
for (const el of [...list]) {
el.classList.add('processed');
}
3. 用 Array.prototype.forEach.call()(不推荐用于 for of)
注意:这不是 for of 的用法,而是传统替代方案。如果你坚持用类数组原地操作且不想转数组,可用:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const arrayLike = {0: 10, 1: 20, length: 2};
Array.prototype.forEach.call(arrayLike, (val, i) => {
console.log(i, val); // 0 10 → 1 20
});
哪些对象算“类数组”?识别关键特征
满足以下两点即为典型类数组对象:
- 拥有数值型索引属性(如
0、1、2…) - 拥有
length属性,且值等于最大索引 + 1(或显式指定)
常见例子:arguments、document.getElementsByTagName() 返回的 HTMLCollection、document.querySelectorAll() 返回的 NodeList(现代浏览器中 NodeList 已原生支持 for of,但旧版需转换)、手动构造的对象。
为什么不能直接 for of?看本质
for of 内部调用对象的 [Symbol.iterator]() 方法。类数组对象默认没有这个方法:
const fakeArr = {0: 'a', length: 1};
console.log(fakeArr[Symbol.iterator]); // undefined
// 所以 for (const x of fakeArr) → TypeError: is not iterable
你可以手动添加迭代器让它“变可遍历”,但通常没必要——Array.from 更直观可靠。
小提醒:NodeList 在不同环境中的差异
现代浏览器中,NodeList(如 querySelectorAll 返回值)已实现 Symbol.iterator,可直接 for of;但 HTMLCollection(如 getElementsByClassName)多数仍不支持,务必先判断或统一用 Array.from 处理。

















