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

Math.pow alternative "**" ES7 polyfill for IE11

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

如果无法做到这一点,有哪些可能的替代方案?

您不能 polyfill 运算符 - 只能是库成员(原型、构造函数、属性)。

由于您的操作仅限于 eval 调用,您可以尝试编写自己的表达式解析器,但这需要大量工作。

(顺便说一句,无论如何你都不应该使用 eval,出于非常充分的理由,我不会在这篇文章中讨论)。

另一个(hack-ish)选项是使用正则表达式来识别 x**y 的普通情况并将它们转换为 Math.pow:

function detectAndFixTrivialPow( expressionString ) {

    var pattern = /(\w+)\*\*(\w+)/i;

    var fixed = expressionString.replace( pattern, 'Math.pow(,)' );
    return fixed;
}

eval( detectAndFixTrivialPow( "foo**bar" ) );

您可以使用正则表达式将出现的 ** 替换为 Math.pow() 调用:

let expression = "(22**3)/12*6+3/2"
let processed = expression.replace(/(\w+)\*\*(\w+)/g, 'Math.pow(,)');

console.log(processed);
console.log(eval(processed));

不过,如果您开始使用嵌套或链式幂表达式,事情可能会变得复杂。

我认为您需要对输入进行一些预处理。以下是我的处理方式:

  1. 在字符串中查找“**”。
  2. 检查左边和右边是什么。
  3. 从左边和右边提取"full expressions" - 如果只有一个数字 - 照原样,如果有一个括号 - 找到匹配的那个并将里面的任何内容作为表达式。
  4. 将2个表达式替换为Math.pow(左,右)