javascript中链表实现iterator协议的核心是通过[symbol.iterator]方法返回符合协议的迭代器对象,可用生成器函数(yield)或手动实现next()方法,支持for...of、展开运算符等原生迭代语法。

JavaScript 中 Iterator 实现链表的顺序迭代访问,核心是让链表实例返回一个符合 Iterator 协议的对象(即有 next() 方法并返回 { value, done } 形式的对象),通常通过在链表类上部署 [Symbol.iterator] 方法来达成。
链表节点与基础结构定义
先定义一个简单的单向链表节点和链表类,便于后续实现迭代逻辑:
(不依赖外部库,纯原生 JS)
class ListNode {
constructor(value) {
this.value = value;
this.next = null;
}
}
class LinkedList {
constructor() {
this.head = null;
}
append(value) {
const newNode = new ListNode(value);
if (!this.head) {
this.head = newNode;
} else {
let current = this.head;
while (current.next) current = current.next;
current.next = newNode;
}
}
}
实现 [Symbol.iterator] 方法
在 LinkedList 类中添加该方法,返回一个迭代器对象。每次调用 next() 时,沿 next 指针移动,逐个返回节点值。
- 迭代器内部需维护当前遍历位置(如用
let current = this.head) - 每次
next()返回{ value: current.value, done: false },直到current === null - 返回的迭代器对象必须有
next方法,且可被for...of、Array.from、展开运算符等消费
class LinkedList {
// ... 上面的构造函数和 append 方法
*[Symbol.iterator]() {
let current = this.head;
while (current) {
yield current.value;
current = current.next;
}
}
}
使用 function* 生成器语法是最简洁自然的方式——它自动满足迭代器协议,无需手动写 next() 方法。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
手动实现迭代器(非生成器版)
如果出于学习或兼容性考虑(比如不支持生成器的环境),可以手动返回迭代器对象:
[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 };
}
};
}
注意:该对象必须可反复调用 next(),且状态独立(不能共享 current 引用)。上面写法中,闭包已确保每次迭代器实例拥有自己的 current 状态。
验证迭代行为
构造链表后,即可用标准迭代方式访问:
const list = new LinkedList();
list.append(1);
list.append(2);
list.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]
所有这些语法都依赖 [Symbol.iterator] 的正确实现,不需要额外封装或转换。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










