2

私は力を含む式を文字列**として評価しようとしています。つまりeval("(22**3)/12*6+3/2")です。問題はInternet Explorer 11がこれを認識せず、構文エラーをスローすることです。これを克服するためにどのポリ充てん剤を使うべきですか?今はModernizr 2.6.2を使用しています。例えば、方程式は次のようになりMath.pow alternative "**" IE7用のES7 polyfill

((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

を交換してください。または、あなたのニーズに合ったものを見つけてください。 –

+3

旧式のブラウザでは、コードが構文エラーとして解析されるため、polyfillはここでお手伝いできません。ブラウザでコードをコードとして変換する前にコードを変換する必要があります(好ましくは、Babelのようなものを使用してサーバー側が望ましい) –

答えて

0

演算子のみのライブラリメンバー(プロトタイプ、コンストラクタ、プロパティ)は使用できません。

操作がevalコールに限定されているため、独自の式パーサーを作成できますが、それは多くの作業になります。

(私がこの投稿に取り掛からないように、とにかくevalを使用しないでください)。

別(ハックっぽい)オプションは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")); 
+0

実際には、式が長すぎます。私が解析している各方程式には、ほぼ10-15の変数と5-10の演算子が含まれています。 – Prajwal

+0

@Prajwal評価している表現の例をさらに投稿してください。そして、等式が定義されたり、満たされたりしないので、それらは「方程式」ではないことに注意してください。 – Dai

+0

サンプルを追加して私の質問を編集しました。 – Prajwal

0

あなたは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));

ネストされた、または連鎖された力の表現を使用すると、状況が複雑になることがあります。

0

入力の前処理をする必要があると思います。これは私がこれに近づく方法です:

  1. "**"を文字列で探します。
  2. 左右に何があるか確認してください。
  3. 左右から「完全な式」を抽出します。数字だけがあればそれをそのまま取り、括弧がある場合は一致するものを見つけて、内部のものを式として取ります。
  4. 独自のパーサを書く必要があるようですねMath.powと2つの式(左、右)