JavaScript范围迭代器生成器函数实现问题:无法输出范围内全部值仅打印交替数字
修复JavaScript迭代器生成器函数的问题
咱们来一步步拆解你的代码问题,搞定这个迭代器不输出完整范围的bug:
核心问题:重复调用next()导致跳过元素
你的while循环里犯了一个典型的错误——每次循环调用了两次values.next():
while (values.next().value != undefined) { tmp.push(values.next().value); }
第一次调用values.next()用来判断循环条件,第二次调用才把值push到数组里。这就相当于你每次循环都跳过了迭代器返回的第一个值,只取了第二个,自然会得到交替出现的数字。
次要问题:变量名大小写不一致
你在生成器里定义了let iterationcount = 0;,但后面赋值用的是iterationCount = i;,大小写不一致会导致这个变量最终是undefined。虽然这个问题暂时没影响数值迭代,但属于语法不严谨的问题,得修正过来。
修复后的完整代码
function iterator(rangeStart, rangeEnd) { if (rangeStart == 0 && rangeEnd == 0) { return null; } var iterate = function*(start = 0, end = 5, step = 1) { let iterationCount = 0; // 统一变量名大小写 for (let i = start; i <= end; i += step) { yield i; iterationCount = i; } return iterationCount; } var values = iterate(rangeStart, rangeEnd); var tmp = []; let result; // 只调用一次next(),保存结果后判断迭代是否完成 while (!(result = values.next()).done) { tmp.push(result.value); } // 按照你的预期输出返回数组,若需要字符串格式可改为tmp.join(",") return tmp; } console.log(iterator(0, 10)); // 输出: [0,1,2,3,4,5,6,7,8,9,10]
关键修改点说明
- 合并
next()调用:先把values.next()的结果保存到result变量中,通过result.done判断迭代是否完成,彻底避免重复调用跳过元素的问题。 - 修正变量名:统一
iterationCount的大小写,保证变量引用的正确性。 - 返回格式调整:原函数返回逗号分隔的字符串,而你的预期输出是数组形式,所以直接返回
tmp数组即可;如果需要字符串格式,再改用tmp.join(",")。
内容的提问来源于stack exchange,提问作者Dival Sehgal
相关产品推荐
相关产品推荐

