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

相关推荐
Kika写代码10 分钟前
【微信小程序】1|底部图标 | 我的咖啡店-综合实训
微信小程序·小程序
JSON_L11 分钟前
小程序 - 模拟时钟
微信·微信小程序·小程序
Kika写代码12 分钟前
【微信小程序】2|轮播图 | 我的咖啡店-综合实训
前端·微信小程序·小程序
长风清留扬1 小时前
小程序毕业设计-音乐播放器+源码(可播放)下载即用
javascript·小程序·毕业设计·课程设计·毕设·音乐播放器
郭wes代码13 小时前
Cmd命令大全(万字详细版)
python·算法·小程序
web1508509664116 小时前
在uniapp Vue3版本中如何解决webH5网页浏览器跨域的问题
前端·uni-app
.生产的驴18 小时前
SpringBoot 对接第三方登录 手机号登录 手机号验证 微信小程序登录 结合Redis SaToken
java·spring boot·redis·后端·缓存·微信小程序·maven
汤姆yu1 天前
基于微信小程序的乡村旅游系统
微信小程序·旅游·乡村旅游
计算机徐师兄1 天前
基于TP5框架的家具购物小程序的设计与实现【附源码、文档】
小程序·php·家具购物小程序·家具购物微信小程序·家具购物
曲辒净1 天前
微信小程序实现二维码海报保存分享功能
微信小程序·小程序