Vanilla JS计算器含负数运算返回NaN问题求助
解决Vanilla JS计算器负数运算返回NaN的问题
核心问题定位
你的推测完全正确,问题根源就在表达式拆分为数字和操作符的逻辑上。常规的拆分正则会把负数的负号误判为独立操作符,导致拆分出无效的空片段或错误数字,最终计算时触发NaN。比如-3+5会被拆成['', '-', '3', '+', '5'],空字符串转数字直接就是NaN。
修正方案:适配负数的正则拆分
替换原来的拆分逻辑,用以下正则提取数字和操作符,能正确识别开头的负数、操作符后的负数(如3*-2):
const expr = "-4+6*-2"; // 示例表达式 const tokens = expr.match(/(-?\d+\.?\d*)|([+\-*/])/g).filter(token => token.trim() !== '');
正则逻辑解释
-?\d+\.?\d*:匹配数字片段,-?表示可选负号(仅匹配表达式开头或操作符后的负号,避免误判),\d+匹配整数部分,\.?\d*匹配可选小数部分;([+\-*/]):单独匹配加减乘除操作符;match(...)全局提取所有符合规则的片段,filter(...)过滤可能出现的空字符串(比如表达式带空格的情况)。
代码调整示例
假设你原本的拆分逻辑是这样的错误写法:
// 错误拆分:会把负号单独拆分 const tokens = expr.split(/([+\-*/])/);
直接替换为上面的match+filter逻辑即可。
验证关键场景
- 单次负数运算:
-10*2→ 拆分结果['-10', '*', '2'],计算得-20; - 含负数的连续运算:
5+-3/2→ 拆分结果['5', '+', '-3', '/', '2'],计算得3.5; - 开头负数的连续运算:
-4+6*-2→ 拆分结果['-4', '+', '6', '*', '-2'],计算得-16。
额外优化提示
- 如果计算器支持括号,更新正则为
/(-?\d+\.?\d*)|([+\-*/()])/g即可兼容; - 拆分前先清理表达式中的空格:
expr = expr.replace(/\s+/g, ''),避免空格干扰匹配。
内容的提问来源于stack exchange,提问作者Loptr
相关产品推荐
相关产品推荐

