JavaScript循环重启时递减全局变量引发无限循环的问题求助
解决字符串匹配循环中的无限循环问题
问题根源分析
你的代码陷入无限循环,是多个问题叠加导致的,不止是修改testLength的问题:
- 基准字符串未同步更新:
outputString0只在初始化时截断了一次,后续testLength递减后,它没有跟着重新截断,导致即使后续元素的截断字符串和当前长度下的基准字符串匹配,也会因为旧的outputString0判断不匹配,最终testLength被减到负数,陷入死循环。 - 错误的比较逻辑:
if ((this['outputString' + i] = output) !== outputString0)里的赋值操作容易混淆,且在非类/对象上下文里this可能指向全局对象或undefined,导致意外行为。 - 无终止边界:当
testLength减到0后继续递减成负数,slice(0, testLength)结果始终为空字符串,但outputString0还是初始的完整字符串,永远无法匹配,循环永远停不下来。 - 未声明变量:
output变量没有用let/const声明,会变成全局变量,不符合编码规范。
修正后的代码
const wordInput = ['fasts', 'fasta', 'fasts', 'fasts', 'fasts']; let testLength = wordInput[0].length; // 初始化为第一个字符串的长度 // 循环直到找到所有字符串的公共前缀,或者长度为0 while (testLength > 0) { const outputString0 = wordInput[0].slice(0, testLength); let allMatch = true; for (let i = 1; i < wordInput.length; i++) { const output = wordInput[i].slice(0, testLength); if (output !== outputString0) { allMatch = false; break; // 只要有一个不匹配,立刻停止当前轮检查 } this[`testString${i}`] = output; // 匹配时保存结果 } if (allMatch) { break; // 所有字符串都匹配当前长度,找到最长公共前缀 } else { testLength--; // 不匹配则缩短长度,重新检查 } } // 验证结果 console.log('最长公共前缀长度:', testLength); console.log('最长公共前缀:', wordInput[0].slice(0, testLength));
修正说明
- 同步基准字符串:每次
testLength变化后,重新计算outputString0,保证和当前截断长度一致。 - 清晰的循环逻辑:用
while循环控制长度递减,内层for循环检查所有元素,避免手动修改i导致的混乱。 - 添加终止边界:
testLength > 0确保不会出现负数长度的情况。 - 规范变量声明:所有变量都用
const/let声明,避免全局污染。 - 直观的比较逻辑:先判断是否匹配,再执行赋值操作,代码可读性更高。
内容的提问来源于stack exchange,提问作者Furius Ed
相关产品推荐
相关产品推荐

