2016-04-05 7 views
0

Ich möchte eine Zeichenfolge als Ausdruck in Javascript auswerten. Ich lese die Zeichenfolge von einem JSON, das dynamisch ist. Also, der Ausdruck kann alles sein. Hier ist der Pseudo-Code, den ich verwendeJavascript Frontend - Auswerten Zeichenfolge als Ausdruck - Alternative für die Verwendung von eval()

var formula = { 
    "expression":"value * 9/5 + 32" //Dynamic JSON 
} 

var value = 26; // Dynamic value 

var result = evaluateExpression(value, formula); 

function evaluateExpression(value, formula) { 
    return eval(formula.expression); 
} 

Dies ist, wie ich Eval() verwendet habe. Gibt es noch eine andere Alternative? Ich habe auch überlegt, Math.js zu verwenden, was ich für meine Anforderungen für übertrieben halte.

+1

Wir wissen nicht erreichen, was Sie Anforderungen * an erster Stelle * sind. –

+0

Was ist falsch mit Eval? es tut was du brauchst. – Rana

+0

Wie ich in der Frage erwähnt habe, muss ich nur die dynamische Zeichenfolge als Ausdruck bewerten. Der Beispielstring im obigen Beispiel ist "value * 9/5 + 32". Das funktioniert gut. Ich wollte nur wissen, ob es alternative Möglichkeiten gibt, dies zu tun –

Antwort

0

Eine Alternative zu eval wäre, einen Parser und Evaluator in Javascript zu erstellen. Das ist eher trivial, aber ein bisschen langweilig. eval ist meistens in Ordnung, es sei denn, Sie werden die Strings eines anderen Benutzers im Browser des anderen Benutzers auswerten. Wenn dies der Fall ist, müssen Sie einen Parser schreiben (oder mit einem Tool wie PEG.js erzeugen).

+0

Ich würde sagen, die Schwierigkeit, einen Interpreter zu schreiben, variiert stark abhängig von der Komplikation des interpretierten Ausdrucks, aber ich würde es niemals als * trivial * bezeichnen. –

0

könnten Sie das gleiche mit Funktions Konstruktor

var formula = { 
 
    "expression":"value * 9/5 + 32" //Dynamic JSON 
 
} 
 

 
var value = 26; // Dynamic value 
 

 
var result = evaluateExpression(value, formula); 
 
alert(result); 
 

 
function evaluateExpression(value, formula) { 
 
    return (new Function('value', 'return (' + formula.expression + ')')(value)); 
 
    //return eval(formula.expression); 
 
}

+0

Fügen Sie bitte hinzu, warum dies besser ist als 'eval' – Bergi

+0

@Bergi Die Anweisungen in der neuen Funktion werden in einem neuen Bereich ausgeführt, in dem eval im aktuellen Bereich ausgeführt wird. Wenn Sie eine lokale Variable in dem in eval übergebenen Ausdruck aktualisieren. Es wird aktualisiert. Außerdem wird es einfacher sein, die Variablen zu verfolgen, die in der Ausdruckszeichenfolge verwendet werden können, indem sie als Parameter im Funktionskonstruktor getrennt werden –

Verwandte Themen