JavaScript中为链表实现Iterator需满足可迭代协议:定义[Symbol.iterator]()返回含next()的对象,next()须做空值检查、按序取值并推进游标,不修改原链表;推荐封装独立迭代器类以增强安全与可维护性。

在 JavaScript 中为自定义数据结构(如链表)实现 Iterator,核心是让该结构满足可迭代协议(iterable protocol),即拥有一个返回迭代器对象的 [Symbol.iterator]() 方法;而该迭代器对象需符合迭代器协议(iterator protocol),即拥有返回 { value, done } 对象的 next() 方法。
确保遍历安全:避免空指针与状态污染
链表节点可能为 null,直接访问 current.next 易抛出 TypeError。安全做法是:在 next() 内部做显式空值检查,不依赖外部状态;每次调用 next() 都应基于当前内部游标(如 this._current)推进,而非修改原始链表结构。
- 初始化迭代器时,把头节点拷贝为私有字段(如
this._current = this._list.head),避免和链表自身引用耦合 -
next()中先判断this._current === null,再取值、再移动,顺序不能颠倒 - 不暴露
this._current,也不允许外部重置或跳转,保证单向、不可逆、无副作用
链表 Iterator 的标准实现结构
以单向链表为例,假设节点形如 { value, next },链表类含 head 属性:
class LinkedList {
// ... 其他方法
[Symbol.iterator]() {
let current = this.head;
return {
next() {
if (current === null) {
return { value: undefined, done: true };
}
const value = current.value;
current = current.next;
return { value, done: false };
}
};
}
}
这样写简洁,但若需复用或调试,建议封装为独立迭代器类,便于控制生命周期和添加防御逻辑。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
进阶:支持 for...of + 提前终止与错误隔离
for...of 会自动调用 next() 直到 done: true,但有时需要中途退出(如找到目标值后 break)。此时只要迭代器不持有外部闭包中的可变引用,就是安全的——JavaScript 引擎会自然释放迭代器作用域。
- 不要在
next()中 throw 错误来“中断”遍历(这会破坏协议),而是靠done: true正常结束 - 若链表在遍历中被外部修改(如并发删除节点),当前迭代器仍按原快照推进,不会崩溃,这是“安全”的体现之一
- 如需深度隔离(例如克隆链表再遍历),可在
[Symbol.iterator]中浅拷贝节点路径,但通常不必要——链表本身不可变时才需,否则开销大且违背设计初衷
验证是否真正可迭代
用最简方式测试:
const list = new LinkedList();
list.append(1).append(2).append(3);
for (const val of list) {
console.log(val); // 1, 2, 3
}
console.log([...list]); // [1, 2, 3]
console.log(Array.from(list)); // [1, 2, 3]
全部通过,说明实现了标准协议;若某处报 is not iterable,大概率是忘记方括号写法 [Symbol.iterator],或返回对象缺少 next 方法。

















