使用splice方法遍历数组触发JavaScript无限循环问题求助
问题分析与修复方案
嘿,这问题太典型了——你页面冻结完全是因为无限循环,跟lib.randomInt一点关系都没有,咱们来一步步拆解:
核心问题:循环条件永远为真
看你这段循环代码:
for(var i = 0; arr.length;i++){ arr.splice((i+1),0,lib.randomInt(9)); }
这里的循环终止条件写的是arr.length,而你每次循环都用splice往数组里插入新元素,arr.length会持续增长,永远是大于0的真值,循环根本停不下来,浏览器当然会卡死!
额外问题:插入逻辑的索引偏移
就算循环能停下来,你的插入逻辑也有小问题:每次splice插入元素后,数组后面的元素都会向后偏移一位,如果不调整i的步长,下一次循环会把新插入的随机数当成原数组元素,继续在它后面插入,这显然不是你想要的效果。
修复后的完整代码
(function() { return function(string) { var arr = string.split(""); arr.sort(); // 保存初始数组长度,让循环只针对原数组的元素执行 var initialLength = arr.length; for(var i = 0; i < initialLength; i++){ // 在当前原元素的下一个位置插入随机数 arr.splice(i + 1, 0, lib.randomInt(9)); // 跳过刚插入的元素,继续处理下一个原数组元素 i++; } var pseudocryptarr = arr.join(""); // 补上返回值,不然函数执行后拿不到结果 return pseudocryptarr; } })()("example");
关键修复点说明
- 固定循环次数:用
initialLength保存原数组的长度,循环条件改成i < initialLength,确保循环只执行原数组元素的次数,不会因为数组变长而无限运行。 - 调整索引步长:每次插入后手动给
i加1,跳过刚插入的随机数,保证下一次循环处理的是原数组的下一个元素。 - 补充返回值:原函数最后没有返回处理后的字符串,补上
return pseudocryptarr;才能拿到最终结果。
另外提个小细节:你调用lib.randomInt(9)会返回0-8的整数,如果需要0-9的随机数,应该改成lib.randomInt(10),这个看你的需求调整就行。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

