微信小程序eval无法使用的替代方案

浏览器环境下,eval 是 JavaScript 中的一个函数,它可以将一个字符串作为 JavaScript 代码进行执行。

例如:

javascript 复制代码
const j = 2;
const p = 5;

const sum = 'j+p';

const result = eval(sum) // ouput: 7

但是在微信小程序中并不支持eval函数。

解决方案:

  1. 安装第三方包

    javascript 复制代码
    npm i expr-eval
  2. 创建calculatorEval.js文件,自定义类似的eval函数,因为eval原生函数比较强大,这里只根据自己的需求实现一些简单的运算

    javascript 复制代码
    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;
  3. 导入calculatorEval方法实现同等需求

    javascript 复制代码
    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库具体支持的运算方法。

  4. 当然,如果使用不受信任的输入,它可能会带来安全风险,因为它可以执行任意代码。可以使用使用白名单,输入验证或其他替代方法来规避。

相关推荐
spmcor1 天前
微信小程序 setStorageSync 踩坑实录:别让"顺手一存"变成"隐形炸弹"
微信小程序
用户4324281061141 天前
小程序埋点设计规范:如何设计可扩展的数据采集体系
微信小程序
m0_526119402 天前
iconfont我修改好颜色,但是在小程序项目是黑色的
小程序
用户6990304848752 天前
try catch使用场景 处理同步代码错误兼容用的
javascript·uni-app
ITKEY_2 天前
uniapp微信开发者工具 更改AppID失败 touristappid
uni-app
2601_956743682 天前
2026 上海小程序开发甄选:源码、云函数、跨端兼容技术评判
小程序·开发经验·上海
IT_张三2 天前
CSDN-项目分享-暑期备考小程序
小程序
IsJunJianXin2 天前
pdd小程序 cdp 保存响应体
linux·服务器·小程序·pdd小程序·拼多多响应体解密·小程序cdp·拼多多rpc取响应体
Geek_Vison2 天前
APP瘦身实战:从80MB+砍到15MB——基于小程序容器技术剥离APP非核心业务的实践分享
小程序·uni-app·mpaas
weikecms2 天前
聚合返利CPS小程序快速搭建教程
人工智能·微信·小程序