【问题标题】:javascript eval with multiple variables具有多个变量的javascript eval
【发布时间】:2022-12-31 03:31:58
【问题描述】:

我想使用 eval 来计算以下具有多个变量的字符串 我将所有变量都存储在我的对象中

let myVars = {
    a : 10,
    b : 20,
    c : 30,
}
let str = "a+b+c+10"
// how to evaluate the string ...

【问题讨论】:

  • 能否请您分享您到目前为止尝试过的内容以及您遇到的问题?
  • 这不是eval的用例,只需使用对象中的属性:myVars.a + myVars.b + myVars.c + 10
  • @Teemu OP 有一个任意字符串,而不是 JavaScript 表达式。
  • 不知道怎么弄,网上也找不到答案
  • 用例是什么? eval 通常不是最佳做法。

标签: javascript variables eval


【解决方案1】:

您可以替换(未知)变量并使用eval(洞穴!)获得结果。

let
    values = { a: 10, b: 20, c: 30 },
    str = "a+b+c+10";

str = str.replace(/[a-z0-9_]+/g, s => values[s] ?? s);

console.log(eval(str));

【讨论】:

  • 这个答案不必要地复杂(在我看来)。但是,有另一种选择是件好事。 ?
【解决方案2】:

我不确定我是否理解你的问题,但我会尽力回答。

eval() 方法将自动从全局上下文中获取变量。如果你想得到结果,只需保存eval()函数的结果即可。

// Object destructuring for easier readability
let { a, b, c } = {
  a : 10,
  b : 20,
  c : 30,
}
let str = "a + b + c + 10";

const total = eval(str);
console.log(total); // Should be: 70

上面的代码将返回数学运算的结果。

但是,你应该never use eval(),因为它可以任意运行任何代码。

【讨论】:

  • 这仅在变量始终为abc 时才有效。
【解决方案3】:

你必须提到 a+b+c... 是针对 myVars 对象的,所以你有不同的方法:

let myVars = {
    a : 10,
    b : 20,
    c : 30,
}
let str = "myVars.a+myVars.b+myVars.c+10"
console.log(eval(str))

尽管我不建议您使用这种方式,因为在这里我们可以在没有 eval 的情况下使用它,这样会更容易。

另一种方法是使用正则表达式:

let myVars = {
    a : 10,
    b : 20,
    c : 30,
}
let str = "a+b+c+10"
const arrayName="myVars"
str=str.replace(/([a-z]+)/gi,arrayName+".$1")
console.log(eval(str))

在这里,您使用 Regex 动态地在变量后面添加对象名称。

或者简单地说,你可以在没有 eval 的情况下做你想做的事(如果你愿意):

let myVars = {
    a : 10,
    b : 20,
    c : 30,
}

let sum=Object.values(myVars).reduce((partialSum, a) => partialSum + a, 0) + 10;
console.log(sum)

【讨论】:

    【解决方案4】:

    您可以使用数学图书馆代替。

    首先下载库:

    npm install mathjs
    

    导入 evaluate(),然后简单地使用评估(表达式,范围)像这样:

    let myVars = {
      a : 10,
      b : 20,
      c : 30,
    }
    let str = "a+b+c+10"
    console.log(evaluate(str, myVars)) # Prints 70
    

    查看文档以获取更多示例:mathjs

    【讨论】:

      【解决方案5】:

      记住 Eval is Evil 因为它允许任意代码执行,你能够在此处使用 the with block 更改 eval 语句的全局命名空间:

      let myVars = {
        a: 10,
        b: 20,
        c: 30,
      };
      let str = "a+b+c+10";
      let result = null;
      with (myVars) {
        result = eval(str);
      }
      console.log(result); // logs 70

      同样,我不建议使用eval

      【讨论】:

      • eval 不是自动邪恶的,(see also Shog9's answer)。没有什么 eval 可以做 DevTools 做不到的事情。如果您将评估的(用户输入)内容发送到您的服务器,然后将其放在任何人都可以访问的页面上,问题就开始了。
      • with 声明在 10 年前已被弃用并且不被推荐,因此您的代码在不推荐的代码上加倍
      • @mplungjan 你在哪里找到它被弃用的信息?当然,正如 MDN 页面所说,出于多种原因不推荐使用它,但没有迹象表明它会被弃用。
      • 好的,它在所有意图和目的中都被弃用了stackoverflow.com/questions/48810592/…
      • MDN 在with 语句文档中说的第一件事就是不应该使用它! See it here.
      猜你喜欢
      • 2015-07-04
      • 1970-01-01
      • 2017-06-24
      • 2012-08-20
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多