JS代码中res变量未更新、内层for循环失效问题排查求助
问题根因
两个异常的直接原因是条件判断书写错误:
- 原代码第5行判断写为
if(x==="("),此处x是完整的表达式字符串,永远不可能等于单个字符(,该判断分支永远不会触发,直接导致内层for循环完全不执行、res始终为初始空值。 - 修正上述判断后,代码仍存在两处逻辑缺陷,无法得到正确的表达式处理结果:
- 内层循环匹配到左括号后第一个运算符就插入右括号,不符合括号配对逻辑。以测试字符串
3+Math.sqrt(345+32为例,缺失的右括号应该补在字符串末尾,而非345和+之间。 - 运算符判断的正则携带
g全局匹配标记,RegExp.test()在全局模式下会维护lastIndex游标,连续调用时会出现错判、漏判。
- 内层循环匹配到左括号后第一个运算符就插入右括号,不符合括号配对逻辑。以测试字符串
修正参考代码
如果需求是自动补全表达式末尾缺失的右括号,可参考如下实现:
const x = '3+Math.sqrt(345+32' let res = x; let unclosedLeftBracket = 0; // 遍历统计未闭合的左括号数量 for (const char of x) { if (char === '(') unclosedLeftBracket++; if (char === ')') unclosedLeftBracket--; } // 末尾补全对应数量的右括号 res += ')'.repeat(Math.max(0, unclosedLeftBracket)); console.log(res); // 输出结果:3+Math.sqrt(345+32)
如果有其他括号插入规则,可以基于字符遍历的逻辑调整对应分支即可。
内容的提问来源于stack exchange,提问作者nDshruthikSai11
相关产品推荐
相关产品推荐

