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));
不过,如果您开始使用嵌套或链式幂表达式,事情可能会变得复杂。
我认为您需要对输入进行一些预处理。以下是我的处理方式:
- 在字符串中查找“**”。
- 检查左边和右边是什么。
- 从左边和右边提取"full expressions" - 如果只有一个数字 - 照原样,如果有一个括号 - 找到匹配的那个并将里面的任何内容作为表达式。
- 将2个表达式替换为Math.pow(左,右)
我正在尝试计算一个包含幂的表达式,在字符串中为 **
。即 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));
不过,如果您开始使用嵌套或链式幂表达式,事情可能会变得复杂。
我认为您需要对输入进行一些预处理。以下是我的处理方式:
- 在字符串中查找“**”。
- 检查左边和右边是什么。
- 从左边和右边提取"full expressions" - 如果只有一个数字 - 照原样,如果有一个括号 - 找到匹配的那个并将里面的任何内容作为表达式。
- 将2个表达式替换为Math.pow(左,右)