如何将字符串数学表达式转换为实际的数学表达式

时间:2016-11-04 03:38:34

标签: javascript

我有一个像10/3*4-7这样的字符串表达式,我想知道是否有某种类型的javascript方法可以将字符串转换为实际表达式,以便我可以得到答案。我有一个随机生成数字和运算符的函数,我想从等式中得到结果。但是,我为获得结果而创建的函数仅从左到右进行计算。它不是由运营商优先级,首先计算*和/得到的东西,以及类似的东西。在javascript中有什么东西可以做到这一点,还是我必须创建一个函数来做这样的事情?

3 个答案:

答案 0 :(得分:3)

我建议使用像Math.js这样的库,因为这将使用正则表达式解析数学表达式。这样可以避免将应用程序打开到跨站点脚本(XSS)攻击。

var answer = math.eval('10/3*4-7');
console.log(answer);
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.6.0/math.min.js"></script>

答案 1 :(得分:0)

此函数接受字符串表达式或创建表达式的字符数组。

&#13;
&#13;
function calculate(expression) {
  "strict mode";
	if(Array.isArray(expression))
		expression = expression.join("");
  var allowedChars = "1234567890%^*()-+/. ";
  for (var i = 0; i < expression.length; i++)
    if (allowedChars.indexOf(expression.charAt(i)) < 0)
      throw new Error("Invalid expression: unexpected '" + expression.charAt(i) + "' in '"+expression+"'");
  return eval(expression);
}

try{
	alert(calculate("4+4"));
	alert(calculate([7,"+",9,"/",34]));
	alert(calculate("45/3"));
	alert(calculate("100 * cheeseburger"));
}catch(e){
	alert(e.message);
}
&#13;
&#13;
&#13;

这就是为什么这是安全的:

  1. 不正确地使用eval会打开您的注射攻击代码
    • strict mode eval中无法向周围范围引入新变量。 (因为它在它自己的功能结束时,无论如何都没有在该范围内发生任何其他事情。)
    • 如果存在任何不属于数学表达式的字符,则该函数将抛出错误,从而无法进行注入。
  2. 使用eval,调试可能更具挑战性(没有行号等)
    • 在这种情况下,函数会抛出一个错误,其中包含一个行号。 eval&#39; d代码只有一行,因此无关紧要。
  3. eval&#39;代码执行速度较慢(无法编译/缓存eval&#d; d代码)
    • 在这种情况下,没有任何东西可以编译/缓存,所以这不是问题。

答案 2 :(得分:-1)

关于为什么你不应该使用eval(),除非没有明确的选择,否则有很多讨论here。在这种情况下使用eval()是完全没必要的,如下例所示:

var expression = "10/3*4-7";
var foo = Function('"use strict"; return '+expression);

console.log(foo());