JavaScript计算器evaluateArray函数无限循环问题排查求助
问题排查与修复
可能的无限循环原因及对应修复方案
1. while循环条件未实时检查数组状态
最常见的问题是将数组包含运算符的判断结果提前存入变量,且未在每次循环迭代后重新计算,导致循环条件始终为true。
错误示例:
const hasOp = calculatorArray.includes(op); while (hasOp) { // 处理逻辑,但未更新hasOp的值 }
修复:每次循环都直接检查当前数组是否包含目标运算符:
while (calculatorArray.includes(op)) { // 处理逻辑 }
2. splice方法参数错误,未移除目标运算符
如果splice的起始索引或删除元素个数写错,会导致运算符未被从数组中移除,循环条件持续成立。
错误示例:
const idx = calculatorArray.indexOf(op); calculatorArray.splice(idx, 3, result); // 起始索引错误,未包含运算符前的数字
修复:从运算符前一位的数字开始,删除包含「数字-运算符-数字」的3个元素,替换为计算结果:
const idx = calculatorArray.indexOf(op); calculatorArray.splice(idx - 1, 3, result);
3. 运算函数返回值异常
如果运算函数返回的结果中意外包含当前运算符(比如错误返回字符串"293/"而非数字293),会导致数组始终保留该运算符,循环无法终止。
排查方式:在运算后添加日志,确认返回值是否为纯数字:
const result = opObj.fn(calculatorArray[idx-1], calculatorArray[idx+1]); console.log(`当前运算结果:${result}`); // 检查结果是否符合预期 calculatorArray.splice(idx - 1, 3, result);
4. 数组中存在非预期的运算符副本
用户输入错误或处理逻辑缺陷可能导致数组中重复出现目标运算符,或意外插入新的运算符,导致while循环一直能匹配到目标。
排查方式:在循环内打印数组状态,观察每次处理后数组的变化:
while (calculatorArray.includes(op)) { console.log(`当前数组:${JSON.stringify(calculatorArray)}`); // 处理逻辑 }
正确实现示例
// 按BEDMAS顺序定义运算规则 const operations = [ { symbol: '/', fn: (a, b) => a / b }, { symbol: '*', fn: (a, b) => a * b }, { symbol: '+', fn: (a, b) => a + b }, { symbol: '-', fn: (a, b) => a - b } ]; function evaluateArray(calculatorArray) { // 复制原数组,避免修改输入数据 const arr = [...calculatorArray]; operations.forEach(({ symbol, fn }) => { while (arr.includes(symbol)) { const idx = arr.indexOf(symbol); // 边界检查:避免数组越界(比如运算符在首尾位置) if (idx === 0 || idx === arr.length - 1) { throw new Error('无效的表达式结构'); } const num1 = arr[idx - 1]; const num2 = arr[idx + 1]; const result = fn(num1, num2); // 替换「数字-运算符-数字」为计算结果 arr.splice(idx - 1, 3, result); } }); return arr[0]; } // 测试示例 const testArr = [586, "/", 2, "*", 5, "+", 17, "-", 12]; console.log(evaluateArray(testArr)); // 输出:1470
内容的提问来源于stack exchange,提问作者GeorgeCiesinski
相关产品推荐
相关产品推荐

