for-of 遍历数组本质调用其 Symbol.iterator 方法,简洁语义清晰,跳过稀疏空位;需索引时用 entries() 解构获取 [i, v],keys() 和 values() 则分别显式迭代索引或值。

JavaScript 中用 for-of 遍历数组,本质就是调用数组内置的迭代器([Symbol.iterator]()),无需手动创建或管理迭代器对象,写法简洁且语义清晰。
直接用 for-of 遍历数组元素
这是最常用也最直观的方式。数组原生支持迭代协议,for-of 会自动调用其 @@iterator 方法,逐个取出值:
- 语法干净,不暴露索引,专注数据本身
- 跳过稀疏数组中的空位(即
undefined占位符),只遍历实际存在的元素 - 不能直接获取索引,如需索引可配合
entries()或使用Array.prototype.keys()
示例:
for (const item of arr) {
console.log(item); // 'a', 'b', 'd'(跳过第三个空位)
}
用 entries() 获取索引和值
如果既要值又要下标,推荐用 arr.entries() —— 它返回一个键值对迭代器,每轮产出 [index, value] 数组:
- 解构赋值让代码更易读:
for (const [i, v] of arr.entries()) - 适用于需要索引参与逻辑的场景,比如构建带序号的列表或条件替换
- 同样跳过稀疏空位,但索引是原始位置编号(不是“第几个有效元素”)
示例:
const colors = ['red', 'green', 'blue'];for (const [idx, color] of colors.entries()) {
console.log(`${idx}: ${color}`); // 0: red, 1: green, 2: blue
}
用 keys() 或 values() 显式选择迭代目标
数组还提供专门的迭代器方法:keys() 返回索引迭代器,values() 等价于默认迭代器(即 for-of 默认行为):
-
arr.values()明确表达“只取值”,增强可读性(尤其在代码审查时) -
arr.keys()可替代Array.from(arr.keys())或传统for (let i = 0; i - 三者都返回真正的迭代器对象,可多次使用(不像生成器函数执行一次就耗尽)
示例:
const nums = [10, 20];for (const key of nums.keys()) {
console.log(key); // 0, 1
}
for (const val of nums.values()) {
console.log(val); // 10, 20
}
注意迭代器的不可重用性与 for-of 的兼容性
for-of 本身不消耗迭代器;它每次都会调用 arr[Symbol.iterator]() 创建新迭代器。但如果你手动获取了迭代器对象,它是一次性的:
- 错误示范:
const iter = arr[Symbol.iterator](); for (const x of iter) {...}—— 第二次for-of会从上次停止处继续,可能提前结束 - 正确做法:每次都让
for-of自动触发[Symbol.iterator],或手动调用iter[Symbol.iterator]()获取新实例 - 所有数组迭代器都遵循标准协议,可传给
Array.from()、展开运算符等接受可迭代对象的 API
示例:
const data = [1, 2, 3];console.log([...data.values()]); // [1, 2, 3]
console.log(Array.from(data.entries())); // [[0,1], [1,2], [2,3]]
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











