Math.pow用于IE11的替代“**”ES7 polyfill

时间:2017-07-11 06:09:35

标签: javascript internet-explorer-11 modernizr polyfills ecmascript-7

我正在尝试评估包含幂的表达式,字符串为**。即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)

如果无法做到这一点,可能的替代方案是什么?

3 个答案:

答案 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)

我认为您需要对输入进行一些预处理。以下是我将如何做到这一点:

  1. 查找" **"在字符串中。
  2. 检查左右两侧的内容。
  3. 提取"完整表达式"从左边和右边 - 如果只有一个数字 - 按原样拍摄,如果有一个括号 - 找到匹配的一个并将内部的任何内容作为表达式。
  4. 用Math.pow(左,右)替换2个表达式