簡體   English   中英

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

[英]Math.pow alternative "**" ES7 polyfill for IE11

我正在嘗試評估一個包含冪的表達式,在字符串中為** eval("(22**3)/12*6+3/2") 。問題是 Internet Explorer 11 無法識別這一點並引發語法錯誤。 我應該使用哪種填充物來克服這個問題? 現在我正在使用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($1,$2)' );
    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($1,$2)'); console.log(processed); console.log(eval(processed));

但是,如果您開始使用嵌套或鏈接的冪表達式,事情可能會變得復雜。

我認為您需要對輸入進行一些預處理。 這是我將如何處理這個問題:

  1. 在字符串中查找“**”。
  2. 檢查左側和右側的內容。
  3. 從左右提取“完整表達式” - 如果只有一個數字 - 按原樣處理,如果有括號 - 找到匹配的一個並將里面的任何內容作為表達式。
  4. 用 Math.pow(left, right) 替換 2 個表達式

您可以在線使用 Babel為 IE 11 轉換 javascript。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM