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

相关推荐
律宏阔10 小时前
Taro 4 项目从 npm 迁移到 pnpm 踩坑实录
前端·微信小程序·taro
码间留白12 小时前
uni-app 鸿蒙离线打包:一个改动从源码到真机要穿过几条链
uni-app·鸿蒙·deveco·离线打包·uts插件
恩创软件开发13 小时前
自助KTV系统管理员续单功能
经验分享·小程序
多客:duokelijie1 天前
代练订单系统选型思路:跨品类游戏接入、订单分层管理、自动结算逻辑拆解!
数据库·mysql·微信小程序·前端框架·uni-app·php·持续部署
码间留白1 天前
鸿蒙端对接 BLE 血压计:从一次握手到读数入库(二)设备篇
物联网·uni-app·鸿蒙·蓝牙ble·血压计
AI源码2 天前
在线考试小程序
小程序·notepad++
计算机毕设定制辅导-无忧学长2 天前
《基于微信小程序健康习惯激励系统设计与实现》
java·spring boot·mysql·微信小程序·uniapp·健康习惯激励系统
华玥作者3 天前
Vue 3 + TypeScript + uni-app 组件库推荐:hy-app(华玥组件库)
vue.js·typescript·uni-app
FinelyYang3 天前
uniapp使用kkfileview在线预览ppt,excel,word,pdf类型文件
pdf·uni-app·powerpoint
2501_916008893 天前
iPhone 设备信息查看,用 KeyMob 看型号、序列号、电池健康和 UDID
android·ios·小程序·https·uni-app·iphone·webview