使用 for...of 语句可以遍历实现了可迭代协议(iterator protocol)的对象,如数组、字符串、map 和 set。只需在循环关键字后指定一个变量来接收每次迭代的值即可,该语法会自动调用对象的 [symbol.iterator] 方法获取迭代器并逐个取值。

哪些内置对象支持 for of 遍历
JavaScript 中常见的可迭代对象包括 Array、String、TypedArray、Map、Set 以及 DOM 集合类(如 NodeList)。这些类型内部都定义了 [Symbol.iterator] 方法,因此可以直接被 for...of 识别。普通 Object 对象默认不可迭代,若强行使用会抛出 TypeError。

const arr = [10, 20, 30]; const str = "AB"; const map = new Map([["a", 1]]); for (let val of arr) console.log(val); // 10, 20, 30 for (let char of str) console.log(char); // A, B for (let entry of map) console.log(entry); // ["a", 1]
如何自定义类使其支持 for of
要让自定义类支持 for...of,必须在原型上实现 [Symbol.iterator] 方法。该方法需返回一个具有 next() 方法的迭代器对象,next() 返回包含 value 和 done 属性的对象。当 done 为 true 时遍历结束。
立即学习“Java免费学习笔记(深入)”;

class Counter {
constructor(limit) { this.limit = limit; this.current = 0; }
*[Symbol.iterator]() {
while (this.current < this.limit) {
yield this.current++;
}
}
}
for (let num of new Counter(3)) {
console.log(num); // 0, 1, 2
}
遍历过程中修改迭代器状态的影响
如果在 for...of 循环体内手动修改了被遍历对象的内部状态(例如改变长度或清空元素),迭代器的行为取决于具体实现。对于数组,索引是动态计算的;对于自定义迭代器,若在 next() 外部修改状态,可能导致跳过项或死循环。建议避免在循环中直接修改源数据结构。


















