web-dev-qa-db-de.com

Alternative zu eval () Javascript

Ich arbeite hauptsächlich mit Javascript, Jquery, Knockout, etc

Eval () hat mich angesprochen

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

Hinweis: Ich arbeite in Fällen, in denen sich der Wert von a und b dynamisch ändert

In meiner Arbeit beschäftige ich mich mit vielen dynamischen Objekten von Json, Knockout usw. Also löst Eval die meisten meiner Probleme. Aber als ich las, stellte ich fest, dass es so viele Probleme mit eval () gibt, wie zB Verlangsamung usw. 

Ich habe viel gesucht und keinen Ersatz für eval () gefunden, wenn ich die Gleichung als String in die Gleichung als Objekt berechnen muss.

Kann jemand eine Plugin- oder Funktionsalternative zu eval () vorschlagen, wobei ich das oben genannte Beispiel im Auge behalten möchte

Problem:

Ich erstelle eine Tabelle aus Json-Daten mit Hilfe der Knockout-Zuordnung. Also, was auch immer das Format von Json ist, wird die Tabelle generiert. Ich berechne auch ein Feld mit dem berechneten Knockout . Im Moment verwende ich hartcodierte

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

Ich möchte diese Gleichungen dynamisch ausführen. Ich kann es dynamisch als Zeichenfolge erstellen, aber es ist das Problem, mit dem ich es zu tun habe.

Ich möchte eine Lösung für

Gibt es eine Möglichkeit, eine in JavaScript in einer Zeichenfolge gespeicherte Formel zu berechnen, ohne eval zu verwenden?

Wie eine Formel

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

Javascript ist in dieser Hinsicht eine sehr flexible Sprache. Es gibt sehr sehr wenige Fälle, in denen eval() die richtige Antwort auf eine gegebene Frage ist, und ist hier sicherlich nicht notwendig.

Wenn Ihre Variablen a und b Teil eines Objekts sind, können Sie mit String-Subskripten darauf zugreifen:

dh myobj.a könnte auch als myobj['a'] referenziert werden.

Von hier aus können Sie eine Variable für den Index verwenden und somit auf jedes Element in myobj dynamisch verweisen, dh:

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

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

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

Keine eval() erforderlich. Sie können die dynamicProperty-Zeichenfolgen beliebig erstellen, so dass die Flexibilität nahezu unbegrenzt ist.

Wenn Ihre Variablen a und b Globals sind, sind JS-Globals im Browser eigentlich Kinder des window-Objekts. Sie können diese Technik also auch bei Globals verwenden.

dh auf Ihre globale Variable a kann auch über window.a oder window['a'] zugegriffen werden. Mit der letzten Option können Sie den gleichen dynamicProperty-Trick ausführen.

Hoffentlich hilft das.

15
Spudley

vielleicht ist die Verwendung von window['var' + num] für Sie nützlicher. Ich verstehe deine Frage leider nicht ganz.

3
Tyler

meinen Sie damit, dass Sie eine Gleichung berechnen möchten, die Sie nicht kennen, bevor Sie sie erhalten haben?

wenn ja, sehen Sie Berechnet den String-Wert in Javascript, nicht mit eval

Zusamenfassend:

eval KANN manchmal verwendet werden, aber nur, wenn die Gleichungszeichenfolge aus einer vertrauenswürdigen Quelle stammt und Sie etwas benötigen, beispielsweise , das dynamische Gleichungen auswertet.

2
user2264587

Wenn Sie sie unter einem Objekt wie root = {a: 1, b: 2} sammeln können, dann

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

kann Ihre Variable res auf dem neuesten Stand halten, wenn sich die Variable a oder b ändert

1
erdysson

Es sieht so aus, als würden Sie versuchen, dynamische Gleichungen eines Benutzers zu erstellen.

Zum Beispiel könnte es "a + b + c" oder "Hund + Katze" sein, und Sie wissen es nicht.

Der beste Weg, um Benutzereingaben wie diese zu behandeln, besteht darin, den Text in Token zu parsen und die Token anschließend in Werte/Operanden zu übersetzen.

Das ist viel Arbeit, aber es gibt vorgerollte Lösungen. Zum Beispiel math.js

0
matchdav

Weitere Alternativen zu eval finden Sie in diese Frage und eine andere hier die beide als Duplikat betrachtet werden könnten ...

Ich verstehe, dass dies nur eine Link-Antwort ist, aber es wird sicherlich für andere hilfreich sein, die nach Alternativen zu eval suchen.

0
Wilt