【问题标题】:JavaScript Library for processing operations用于处理操作的 JavaScript 库
【发布时间】:2012-10-02 19:23:38
【问题描述】:

我的代码动态生成字符串/数字操作。该程序动态构建类似于以下内容的内容:

"My name " + "is " + "G-Man"
"Your age is " + "21"
"5" * "5"

我想输出这个:

My Name is G-Man
Your age is 21
25

我可以为此编写一个库,但我目前处于时间限制之下。如果有人知道可以执行类似于上述方程的库(int + int = int),(string + int = string)等?

【问题讨论】:

  • 你真的想让"5" * "5"输出10吗?
  • 糟糕....刚刚解决了这个问题...最初我输入了 5+5,但改为乘法
  • Can't parseInt() 和 parseFloat() 已经做你需要的了吗?
  • 它要复杂得多...人们可以有很长的方程式...如果我找不到类似的库,我可能会写一个,但为了节省时间,而不是重新发明轮子,我希望有一些东西可以实现这一点....
  • @Pathachiever11 - 请添加一个 eval(...) 不起作用的示例,以便我们更好地了解您所追求的深度。

标签: javascript parsing expression-evaluation


【解决方案1】:

我想你可能只是想使用 JavaScript 内置的 EVAL 函数。

var a = eval("5 + 5");
console.log(a); // >> 10

编辑哇,当我回答这个问题时,我以几乎机器人的速度获得了 2 票否决~很奇怪,但 EVAL 可能就是你想要的。

var a = eval("'Your age is ' + '22'");
console.log(a); // >> Your age is 22 

编辑 2 这是对输入进行一些快速验证以确保没有任何顽皮的东西被 Eval'd 的起点。

var test1 = [
"testing"
,"+"
,"123"
];
var test2 = [
"8"
,"*"
,"5"
,"/"
,"3"
];
var test3 = [
"window.alert('bad');"
];
var test4 = [
"\"It's hard to escape things\", said "
," + "
,"Bob"
];

function supereval(arr) {
    var sEval = '';
    for(var i=0; i<arr.length; i++) {
        if(!isNaN(parseFloat(arr[i])) && isFinite(arr[i])) { // number
            sEval += arr[i];
//console.log("> number");
        } else if( /^\s?[\+\/\*\-]\s?$/i.test(arr[i]) ) { // operation
            sEval += arr[i];
//console.log("> operation");
        } else { // string
            sEval += "\"" + arr[i].replace(/"/g, '\\"') + "\"";
//console.log("> string");
        }
    }
console.log("DEBUG:" + sEval);
    return eval(sEval);
}

console.log(supereval(test1));
console.log(supereval(test2));
console.log(supereval(test3));
console.log(supereval(test4));

【讨论】:

  • 我确实调查过,但它不适用于字符串......不过我没有投票给你,因为那是我首先尝试的...... :)
  • @Pathachiever11 - 我添加的示例表明它也适用于字符串。
  • 我必须同意eval 是“即时”计算事物的最佳选择,但我建议至少在它前面放置一个警卫,将其列入白名单标识符、数字和运算符。尽量减少可能的注入可执行代码。
  • 我不是一个下意识的 eval 是邪恶的机器人,但最好谨慎使用它,并说明为什么它适合在一个给定的案例。由于听起来字符串来自用户输入(?),只是盲目地评估它可能不是最好的方法。
  • @Jeremy J Starcher - 如果您允许用户输入任何内容,则肯定需要进行一些验证。我已经用一个简单的 eval 包装器更新了答案,它接受数组输入并进行一些额外的完整性检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 2018-09-24
  • 1970-01-01
相关资源
最近更新 更多