2016-03-21 8 views
0

Ich habe einen String-Ausdruck wie: "1+2+3", und es muss als Zeichenfolge bleiben. Mit anderen Worten, das Schleifen und Umwandeln der Ziffern zur Ausführung der Operation ist keine Option, daher lautet meine Lösung eval("1+2+3"). Aber eval() ist langsam und hat alle diese Probleme damit verbunden. Gibt es eine Alternative, um meine Saite auszuwerten?Gibt es eine eval() Alternative für diesen Ausdruck?

+0

Kann dieser Ausdruck, indem sie zum Beispiel aufgebaut werden, die "1", "2" und "3" als Eingänge? –

+3

Sie könnten Ihren eigenen Parser schreiben, wenn Sie sich mutig fühlen oder etwas auf [NPM] (http://npmjs.com) finden, das es für Sie tut. 'eval' ist nicht langsam. Es ist nur Ärger **. – tadman

+1

Wenn Sie Teile der Zeichenkette nicht zu Nummern loopen können, gibt es keine anderen Optionen, aber das ist was eval hier tut, es bewertet den Ausdruck in der Zeichenkette – adeneo

Antwort

2

Auswerten einer Zeichenfolge ist nicht nur langsam, es ist gefährlich. Was ist, wenn Sie durch Absicht oder Fehler eines böswilligen Benutzers am Ende Code auswerten, der Ihr Programm zum Absturz bringt, Ihre Daten zerstört oder eine Sicherheitslücke öffnet?

Nein, Sie sollten nicht die Zeichenfolge eval(). Sie sollten es teilen, die Operanden in Zahlen umwandeln und sie summieren.

Sie können die string halten um, wenn Sie mögen (Sie sagten, Sie die Zeichenfolge erforderlich), aber die string eigentlich mit dieser Operation auszuführen ist ein wirklich schlechte Idee.

var string = "1+2+3" 
var numbers = string.split('+').map(function(x) { return parseInt(x) }) 
var sum = numbers.reduce(function(total, x) { return total + x }, 0) 
+1

OP: "_casting die Ziffern, um die Operation durchzuführen, ist keine Option_" – dandavis

+0

Es ist was "eval" tut. Wenn Sie eine Funktion aufrufen, um das zu tun, was ist der Unterschied? – slezica

0

Dies ist eine dumme Frage:

var reducer = function (a, b) { 
    return +a + +b; 
}; 

"1+2+3".match(/[+-]?\d+/g).reduce(reducer); // 6 

// or addition only 
"1+2+3".split(/\D/).reduce(reducer); // 6 
Verwandte Themen