浏览器环境下,eval
是 JavaScript 中的一个函数,它可以将一个字符串作为 JavaScript 代码进行执行。
例如:
javascript
const j = 2;
const p = 5;
const sum = 'j+p';
const result = eval(sum) // ouput: 7
但是在微信小程序中并不支持eval函数。
解决方案:
-
安装第三方包
javascriptnpm i expr-eval
-
创建calculatorEval.js文件,自定义类似的eval函数,因为eval原生函数比较强大,这里只根据自己的需求实现一些简单的运算
javascriptconst Parser = require("expr-eval").Parser; const parser = new Parser(); // Add a new function // parser.functions.parseFloatFunction = function (arg1, arg2) { // return parseFloat(arg1).toFixed(arg2); // }; /** * 小程序中不支持eval的代替方案 * @param {*} express 字符串表达式 * @param {*} assignments 需要作为变量的对象值,格式为{j} * @returns */ function calculatorEval(express, assignments) { let expr = express; if (express.includes("parseFloat")) { // 这里对parseFloat 特殊处理, 请参考https://github.com/silentmatt/expr-eval?tab=readme-ov-file#parserevaluateexpression-string-variables-object // 不支持的表达式转换需要再次处理 if (express.includes("toFixed")) { expr = express.replace(new RegExp(/(parseFloat)(.*)(.toFixed)(.*)/g), "$2"); } else { expr = express.replace(new RegExp(/(parseFloat)(.*)/g), "$2"); } let arg2 = express.replace(new RegExp(/(.*)(.toFixed\()(.*)(\))/g), "$3"); const arg1 = Parser.evaluate(expr, assignments); if (arg2 === "") { arg2 = 1; } const res = parseFloat(arg1).toFixed(arg2); return res; } const res = Parser.evaluate(expr, assignments); return res; } export default calculatorEval;
-
导入calculatorEval方法实现同等需求
javascriptconst j = 2; const p = 5; const sum = 'j+p'; const result = calculatorEval(sum, { j, p }) // ouput: 7
可以点击GitHub - silentmatt/expr-eval: Mathematicression evaluator in JavaScript查看expr-eval库具体支持的运算方法。
-
当然,如果使用不受信任的输入,它可能会带来安全风险,因为它可以执行任意代码。可以使用使用白名单,输入验证或其他替代方法来规避。