我正在尝试评估包含幂的表达式,字符串为**
。即eval("(22**3)/12*6+3/2")
。问题是Internet Explorer 11无法识别此问题并引发语法错误。我应该使用哪种poly-fill来克服这个问题?现在我正在使用Modernizr 2.6.2
。
示例公式将是,
((1*2)*((3*(4*5)*(1+3)**(4*5))/((1+3)**(4*5)-1)-1)/6)/7
((1*2)*((3*(4*5)*(1+3)**(4*5))/((1+3)**(4*5)-1)-1)/6)/7*58+2*5
(4*5+4-5.5*5.21+14*36**2+69/0.258+2)/(12+65)
如果无法做到这一点,可能的替代方案是什么?
答案 0 :(得分:1)
您不能使用polyfill运算符 - 只能使用库成员(原型,构造函数,属性)。
由于您的操作仅限于eval
调用,您可以尝试编写自己的表达式解析器,但这将是很多工作。
(顺便说一下,你不应该使用eval
,原因很简单,我不会在这篇文章中介绍。)
另一个(hack-ish)选项是使用正则表达式来识别x**y
的琐碎案例并将其转换为Math.pow
:
function detectAndFixTrivialPow( expressionString ) {
var pattern = /(\w+)\*\*(\w+)/i;
var fixed = expressionString.replace( pattern, 'Math.pow($1,$2)' );
return fixed;
}
eval( detectAndFixTrivialPow( "foo**bar" ) );
答案 1 :(得分:1)
您可以使用正则表达式将**
的出现替换为Math.pow()
次调用:
let expression = "(22**3)/12*6+3/2"
let processed = expression.replace(/(\w+)\*\*(\w+)/g, 'Math.pow($1,$2)');
console.log(processed);
console.log(eval(processed));

如果您开始使用嵌套或链接的幂表达式,事情可能会变得复杂。
答案 2 :(得分:0)
我认为您需要对输入进行一些预处理。以下是我将如何做到这一点: