微信小程序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. 当然,如果使用不受信任的输入,它可能会带来安全风险,因为它可以执行任意代码。可以使用使用白名单,输入验证或其他替代方法来规避。

相关推荐
星光一影6 小时前
美容/心理咨询/问诊/法律咨询/牙医预约/线上线下预约/牙医行业通用医疗预约咨询小程序
mysql·小程序·vue·php·uniapp
游戏开发爱好者87 小时前
H5 混合应用加密 Web 资源暴露到 IPA 层防护的完整技术方案
android·前端·ios·小程序·uni-app·iphone·webview
wangpq7 小时前
记录曾经打开半屏小程序遇到的事
前端·微信小程序
2501_915106327 小时前
最新版本iOS系统设备管理功能全面指南
android·macos·ios·小程序·uni-app·cocoa·iphone
游戏开发爱好者87 小时前
HTTPS DDoS 排查 异常流量到抓包分析
网络协议·ios·小程序·https·uni-app·iphone·ddos
jay神8 小时前
【原创】基于小程序的图书馆座位预约系统
微信小程序·小程序·毕业设计·图书馆自习室座位预约系统·座位预约系统
计算机徐师兄8 小时前
Java基于微信小程序的物流管理系统【附源码、文档说明】
java·微信小程序·物流管理系统·java物流管理系统小程序·物流管理系统小程序·物流管理系统微信小程序·java物流管理系统微信小程序
一点晖光8 小时前
小程序中web-view加载uni-app H5如何使用postMessage方法的解决方案
前端·小程序·uni-app
2501_915918418 小时前
iOS 性能监控 运行时指标与系统行为的多工具协同方案
android·macos·ios·小程序·uni-app·cocoa·iphone
qq_424409199 小时前
uniapp,通过webview内嵌h5页面,如何修改h5的大小
uni-app