You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript循环重启时递减全局变量引发无限循环的问题求助

解决字符串匹配循环中的无限循环问题

问题根源分析

你的代码陷入无限循环,是多个问题叠加导致的,不止是修改testLength的问题:

  1. 基准字符串未同步更新:outputString0只在初始化时截断了一次,后续testLength递减后,它没有跟着重新截断,导致即使后续元素的截断字符串和当前长度下的基准字符串匹配,也会因为旧的outputString0判断不匹配,最终testLength被减到负数,陷入死循环。
  2. 错误的比较逻辑:if ((this['outputString' + i] = output) !== outputString0)里的赋值操作容易混淆,且在非类/对象上下文里this可能指向全局对象或undefined,导致意外行为。
  3. 无终止边界:当testLength减到0后继续递减成负数,slice(0, testLength)结果始终为空字符串,但outputString0还是初始的完整字符串,永远无法匹配,循环永远停不下来。
  4. 未声明变量: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 07:15:36