让普通类数组对象变成可迭代对象,核心是添加[symbol.iterator]方法并返回含next()的迭代器对象,next()须返回{value, done};1. 类数组对象有length和数字索引但无数组方法;2. 手动实现时需维护索引状态,每次next()返回对应元素或{value: undefined, done: true}。

让普通类数组对象变成可迭代对象,核心是给它加上 [Symbol.iterator] 方法,使其符合迭代器协议。这个方法必须返回一个对象,该对象有 next() 方法,且 next() 返回形如 { value, done } 的对象。
1. 什么是类数组对象
类数组对象指拥有 length 属性和若干数字索引属性(如 0、1),但没有原生数组方法(如 map、forEach)的对象,比如 arguments、NodeList 或手动构造的 {0: 'a', 1: 'b', length: 2}。
2. 手动添加 [Symbol.iterator]
直接在对象上定义 [Symbol.iterator] 方法即可。关键是内部维护索引,每次调用 next() 时返回对应元素,并判断是否结束:
- 用闭包或绑定
this保存当前遍历状态(如索引i) -
next()中先检查i ,满足则返回 <code>{ value: this[i++], done: false } - 超出范围时返回
{ value: undefined, done: true }
示例:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
const arrayLike = { 0: 'x', 1: 'y', 2: 'z', length: 3 };
arrayLike[Symbol.iterator] = function() {
let i = 0;
return {
next: () => (i
<h3>3. 复用 Array.prototype 的迭代器(推荐)</h3>
<p>更简洁安全的方式是借用 <code>Array.prototype[Symbol.iterator]</code>,前提是对象结构确实“像数组”(有数字索引 + length):</p>
- 用
Array.prototype[Symbol.iterator].call(obj)绑定上下文 - 避免手写逻辑出错,也兼容稀疏类数组(如
{0: 'a', 2: 'c', length: 3})
示例:
const arrayLike = { 0: 'a', 1: 'b', length: 2 };
arrayLike[Symbol.iterator] = Array.prototype[Symbol.iterator];
[...arrayLike]; // ['a', 'b']
4. 注意事项
确保 length 是非负整数,否则迭代行为可能不符合预期;Symbol.iterator 必须是函数(不能是箭头函数,因需正确绑定 this);若对象本身已有 [Symbol.iterator],会覆盖原有行为。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










