32

私は主にjavascript、Jquery、ノックアウトなどを扱っています

eval() に惹かれたのは

var a = 5;
var b = 10;
eval("a+b");
//Gives me output 15

注: と の値が動的に変化するa場合に作業しますb

私の仕事では、json、ノックアウトなどの多くの動的オブジェクトを扱っています。そのため、eval は私の問題のほとんどを解決します。しかし、読んでみると、速度低下など、eval() には非常に多くの問題があることがわかりました。

私はたくさん検索しましたが、文字列として取得する方程式をオブジェクトとして方程式に評価する必要がある場合、eval() の代わりは見つかりませんでした。

上記の例を念頭に置いて、誰でも eval() に代わるプラグインまたは関数を提案できますか

問題:

ノックアウト マッピングを使用して、Json データからテーブルを作成しています。そのため、json の形式が何であれ、テーブルが生成されます。また、計算されたノックアウトを使用していくつかのフィールドを計算します。今、私はハードコードを使用しています

self.Salary = ko.computed(function(){ return self.salaryEqn() && eval(self.salaryEqn()).toFixed(2); })
self.salaryEqn(salEqnTxt); 

これらの方程式を動的に実行したい。文字列として動的に作成できますが、それらを評価することは私が直面している問題です。

解決策が欲しい

evalを使用せずにJavaScriptの文字列に格納された式を計算する方法はありますか?

式のように

 "self.Salary = ko.computed(function(){ return self.salaryEqn() && eval(self.salaryEqn()).toFixed(2); })"
4

6 に答える 6

26

この点で、Javascript は非常に柔軟な言語です。与えられた質問に対して が正しい答えであるケースはほとんどなく、ここでは確かに必要ありません。eval()

aおよび変数がオブジェクトの一部である場合b、文字列の添字を使用してそれらにアクセスできます。

iemyobj.aとして参照することもできますmyobj['a']

そこから、添え字に変数を使用できるため、myobj動的に任意の要素を参照できます。つまり、次のようになります。

var myobj = {a : 5, b : 10};

var dynamicProperty1 = 'a';
var dynamicProperty2 = 'b';

//gives 15.
alert( myobj[dynamicProperty1] + myobj[dynamicProperty2] );

必要ありませんeval()。ストリングは自由に作成できるため、dynamicProperty事実上無限の柔軟性があります。

aおよびb変数がグローバルである場合、ブラウザーの JS グローバルは実際にはwindowオブジェクトの子であるため、グローバルでもこの​​手法を使用できます。

つまり、グローバル変数にはまたはaを介し​​てアクセスすることもできます。後者のオプションを使用すると、上記と同じトリックを実行できます。window.awindow['a']dynamicProperty

それが役立つことを願っています。

于 2013-04-16T13:15:27.123 に答える
5

受けてみないと分からない方程式を計算したいということですか?

その場合は、 eval を使用せずに JavaScript で文字列値を計算するを参照してください。

要するに:

eval は時々使用できますが、方程式文字列が信頼できるソースからのものであり、動的方程式を評価するようなものが必要な場合にのみ使用できます。

于 2013-04-16T12:56:53.787 に答える
2

を使用window['var' + num]する方が便利かもしれません。私はあなたの質問をよく理解していません。

于 2013-04-16T12:32:39.540 に答える
0

ユーザーが作成した動的方程式を実行しようとしているようです。

たとえば、'a+b+c' または 'dog+cat' である可能性がありますが、わかりません。

このようなユーザー入力式を処理する最善の方法は、テキストをトークンに解析してから、トークンを値/オペランドに変換することです。

これは大変な作業ですが、あらかじめ用意されたソリューションがあります。たとえば、math.js

于 2015-10-20T17:57:19.230 に答える