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

相关推荐
恩创软件开发4 小时前
创业日常2026-1-8
java·经验分享·微信小程序·小程序
腾讯云云开发12 小时前
微信发布AI小程序成长计划:免费云开发资源+1亿token额度!
微信小程序·ai编程·小程序·云开发
iOS阿玮12 小时前
AppStore卡审依旧存在,预计下周将逐渐恢复常态!
uni-app·app·apple
开发加微信:hedian11612 小时前
推客与分销场景下的系统架构实践:如何支撑高并发与复杂业务规则
小程序
郑州光合科技余经理13 小时前
开发实战:海外版同城o2o生活服务平台核心模块设计
开发语言·git·python·架构·uni-app·生活·智慧城市
行走的陀螺仪14 小时前
在UniApp H5中,实现路由栈的持久化
前端·javascript·uni-app·路由持久化·路由缓存策略
影子打怪14 小时前
uniapp通过plus.geolocation.watchPosition获取的坐标格式转换
uni-app
游九尘14 小时前
在小程序中实现横竖屏切换的配置方法,实时监听页面宽度
小程序
weixin_lynhgworld14 小时前
[特殊字符]旧物焕新颜,二手变宝藏——小程序系统开发开启绿色生活新篇章[特殊字符]
小程序·生活
说私域14 小时前
小程序电商运营中“开源AI智能名片链动2+1模式S2B2C商城小程序”对培养“老铁”用户的重要性研究
人工智能·小程序·开源