浏览器环境下,eval
是 JavaScript 中的一个函数,它可以将一个字符串作为 JavaScript 代码进行执行。
例如:
const j = 2;
const p = 5;const sum = 'j+p';const result = eval(sum) // ouput: 7
但是在微信小程序中并不支持eval函数。
解决方案:
- 安装第三方包
npm i expr-eval
- 创建calculatorEval.js文件,自定义类似的eval函数,因为eval原生函数比较强大,这里只根据自己的需求实现一些简单的运算
const 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方法实现同等需求
const 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库具体支持的运算方法。
-
当然,如果使用不受信任的输入,它可能会带来安全风险,因为它可以执行任意代码。可以使用使用白名单,输入验证或其他替代方法来规避。