js实现evaluation
JavaScript 实现表达式求值
在 JavaScript 中实现表达式求值可以通过多种方法,包括原生 eval() 函数、手动解析表达式树或使用第三方库。以下是几种常见实现方式:
使用 eval() 函数
eval() 是 JavaScript 原生函数,直接执行字符串形式的代码或表达式:
const expression = "2 + 3 * 4";
const result = eval(expression); // 输出 14
注意:eval() 存在安全风险,可能执行恶意代码,仅适用于可信输入。
手动解析表达式(逆波兰法)
通过栈实现逆波兰表达式(后缀表达式)求值:
function evaluateRPN(tokens) {
const stack = [];
for (const token of tokens) {
if (!isNaN(token)) {
stack.push(parseFloat(token));
} else {
const b = stack.pop();
const a = stack.pop();
switch (token) {
case '+': stack.push(a + b); break;
case '-': stack.push(a - b); break;
case '*': stack.push(a * b); break;
case '/': stack.push(a / b); break;
}
}
}
return stack.pop();
}
// 示例:计算 "3 4 + 2 *"(等价于 (3 + 4) * 2)
const result = evaluateRPN(["3", "4", "+", "2", "*"]); // 输出 14
使用第三方库
-
Math.js:支持复杂表达式和符号计算:
import { evaluate } from 'mathjs'; const result = evaluate("2 + 3 * 4"); // 输出 14 -
Expr-eval:轻量级表达式解析库:
const parser = new Parser(); const expr = parser.parse("2 + 3 * 4"); const result = expr.evaluate(); // 输出 14
处理变量和函数
扩展手动解析方法以支持变量和自定义函数:
const context = { x: 2, y: 3 };
const expression = "x * y + 5";
const result = new Function(...Object.keys(context), `return ${expression}`)
(...Object.values(context)); // 输出 11
安全注意事项
- 避免直接使用
eval()处理用户输入。 - 手动解析或使用库时,需验证输入合法性(如运算符、括号匹配)。
- 对变量名进行白名单过滤,防止注入攻击。
以上方法可根据需求选择,简单场景用 eval(),复杂场景推荐使用库或手动解析。







