web-dev-qa-db-ja.com

eval()javascriptの代替

私は主にjavascript、Jquery、ノックアウトなどで仕事をしています

Eval()を私に引き付けたのは

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

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

私の仕事では、json、knockoutなどの多くの動的オブジェクトを扱っています。したがって、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); })"
23
Okky

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

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

つまり、_myobj.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.a_または_window['a']_からもアクセスできます。後者のオプションを使用すると、上記と同じdynamicPropertyトリックを実行できます。

それが役に立てば幸いです。

17
Spudley

多分window['var' + num]の方が便利かもしれません。ご質問の内容がよくわかりません。

3
Tyler

受け取るまでわからない方程式を計算したいのですか?

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

要するに:

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

2
user2264587

root = {a: 1, b: 2}などのオブジェクトの下でそれらを収集できる場合、

Object.observe(root, function(newValues) { 
    res = newValues.object.a + newValues.object.b;
});

resまたはaが変更されるたびに、b変数を最新の状態に保つことができます

1
erdysson

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

たとえば、「a + b + c」または「dog + cat」の場合がありますが、わかりません。

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

これは大変な作業ですが、事前に解決されたソリューションがあります。たとえば、 math.js

0
matchdav

この質問ここに別の1つevalの代替案を確認してください。どちらも重複していると考えられます...

これはリンクのみの回答であることは理解していますが、evalの代替を検索する他の人にとっては間違いなく役立つでしょう。

0
Wilt