for...of 能遍历类数组集合的根本原因是其对象实现了 iterator 接口(即拥有[symbol.iterator]方法)。天然支持的包括:①array、string、typedarray;②map、set、domtokenlist、现代nodelist;③es2015+中arguments。

JavaScript 中 for...of 能遍历类数组集合(如 arguments、NodeList、TypedArray 等),根本原因是这些对象实现了 Iterator 接口,即拥有 [Symbol.iterator] 方法。只要一个对象有这个方法并返回符合迭代器协议的对象(含 next()),它就能被 for...of 消费。
哪些类数组天然支持 for...of?
不是所有类数组都原生可迭代。以下常见类型已内置 [Symbol.iterator]:
-
Array、String、TypedArray(如Uint8Array)——直接可用 -
Map、Set、DOMTokenList、现代浏览器中的NodeList(如document.querySelectorAll()返回值)——也默认可迭代 -
arguments对象(函数内)在 ES2015+ 环境中也实现了迭代器(但严格模式下需注意兼容性)
不支持的类数组怎么办?手动加 Iterator
像老版本 NodeList(IE)、自定义类数组对象(如 {0: 'a', 1: 'b', length: 2}),默认没有 [Symbol.iterator]。这时可以手动挂载:
const arrayLike = {0: 'x', 1: 'y', length: 2};
arrayLike[Symbol.iterator] = function* () {
for (let i = 0; i for (const item of arrayLike) {
console.log(item); // 'x', 'y'
}
也可以用 Array.from() 或展开语法间接转为真数组再遍历(适合一次性操作):
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
for (const item of Array.from(arrayLike)) { ... }for (const item of [...arrayLike]) { ... }
自定义类怎么让实例支持 for...of?
在 class 原型上定义 [Symbol.iterator] 方法即可:
class Range {
constructor(start, end) {
this.start = start;
this.end = end;
}
*[Symbol.iterator]() {
for (let i = this.start; i for (const n of new Range(1, 4)) {
console.log(n); // 1, 2, 3
}
注意:推荐用 生成器函数(function*) 实现,它自动返回符合迭代器协议的对象,比手写 next() 更简洁可靠。
for...of 和传统 for 循环的关键区别
for...of 不关心索引或长度,只依赖迭代器协议;而传统 for (let i = 0; i 依赖 <code>length 属性和数字键访问。这意味着:
- 迭代器可按需生成值(如无限序列、异步数据流),不预先占用内存
- 即使
length属性缺失或不准确,只要实现[Symbol.iterator]就能遍历 - 对稀疏数组或键名非纯数字的对象,
for...of只遍历迭代器“产出”的值,不暴露空槽位
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










