JavaScript读取文本文件遍历列表时next()死循环问题咨询
问题现象
实现自定义List类遍历films.txt读取的电影列表时,预期next()方法移动到列表最后一条记录后停止,完成所有元素遍历展示,实际运行时触发无限循环,最后一条记录被重复无限打印。
涉及的测试数据共5条:
- The Shawshank Redemption
- The God Father
- Pulp Fiction
- The Good, the bad and the Ugly
- 12 Angry Men
异常运行时,5条记录正常输出后,会持续重复打印最后一条12 Angry Men,进程无法正常终止。
根因排查
按代码执行链路逐段校验可定位两个核心问题:
- 边界判断逻辑不匹配
列表共5条数据时,listSize值为5,数组有效索引范围是0~4。现有next()方法的移动逻辑加了拦截:仅当this.pos < this.listSize - 1时才会移动指针。也就是说当指针pos移动到4(最后一条元素的索引位置)时,判断条件4 < 4结果为false,指针会永久停在4的位置不再变化。
而displayList()中for循环的终止条件是list.currPos() < list.length(),当pos固定为4时,4 < 5永远成立,循环永远不会退出,因此会反复读取索引4对应的元素打印,形成无限循环。 - 冗余代码问题
代码中重复定义了两次同名next()函数,JavaScript中后定义的同名函数会覆盖前序定义,虽然两份next()逻辑完全一致不影响运行结果,但属于无效冗余,不符合编码规范。
修复实现建议
推荐采用通用迭代器设计逻辑修复,代码可读性和可维护性更好:
- 删除重复定义的冗余
next()方法 - 调整
next()方法职责,仅负责向后移动指针,移除内部的边界拦截逻辑 - 新增
hasNext()方法,专门用于判断当前指针位置是否还有可读取的元素 - 调整
displayList()的循环终止条件,用hasNext()替代原有长度判断
修正后的核心代码如下:
function List() { this.listSize = 0; this.pos = 0; this.dataStore = []; this.length = length; this.toString = toString; this.append = append; this.front = front; this.currPos = currPos; this.next = next; this.getElement = getElement; this.hasNext = hasNext; // 注册新增的边界判断方法 } // append、length、toString、front、currPos、getElement、createArr方法逻辑无需改动 // 修正next方法:仅负责指针后移,不做边界拦截 function next(){ ++this.pos; } // 新增独立的边界判断方法 function hasNext(){ return this.pos < this.listSize; } // 修正遍历逻辑 function displayList(list){ for(list.front(); list.hasNext(); list.next()){ console.log(list.getElement()); } }
修复后运行代码,会按顺序输出全部5条电影记录,遍历完成后循环正常终止,不会再出现无限重复打印的问题。
如果不想调整现有next()的边界拦截逻辑,也可以直接修改循环终止条件,在指针到达最后一个元素索引后退出循环,但这种实现不符合常规迭代器的使用习惯,后续扩展prev、end等方法时容易出现新的边界问题,不推荐使用。
内容的提问来源于stack exchange,提问作者user1987750
相关产品推荐
相关产品推荐

