2015-04-14 15 views
5

Chcę obliczyć dwie liczby i jest to całkiem proste.Jak wziąć plus zaloguj zmienną

Ale czy istnieje sposób, aby wziąć operatora w zmiennej, a następnie wykonać obliczenia?

var x = 5; 
 
var y = 5; 
 
var p = '+'; 
 
var z = x + p + y; 
 

 
$(".button").click(function() { 
 
    alert(z); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="button">Click ME !</div>

+2

Prosty przełącznik ... 'byłoby case' zrobienia. –

+0

Oto odpowiedź na twoje pytanie - http://stackoverflow.com/questions/5834318/support_operators-możliwość- – Yellen

+1

Jeśli musisz tylko zdecydować między '+' a '-' możesz również pomnożyć przez' var p = 1' lub 'var p = -1'. –

Odpowiedz

3

Szukasz eval funkcji:

\t var x = 5; 
 
\t var y = 5; 
 
\t var p = '+'; 
 
\t var z = x + p + y; 
 

 
$(".button").click(function(){ 
 
    alert(eval(z)); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="button">Click ME !</div>

Jednak trzeba pamiętać, że korzystanie eval funkcję jest potencjalnie ryzykowne. Na przykład, jeśli zostanie użyty w niewłaściwy sposób, może pozwolić na wykonywanie iniekcji. Debugowanie może być również trudniejsze. Proponuję przeczytać ten question.

+0

Dzięki! Zrobione .. Przyjmę to po 10 min. Dziękuję bardzo :) – Twix

+3

@ Twix - pamiętaj, że używanie 'eval' zawiera pewne ostrzeżenia - funkcja spróbuje wykonać ** dowolny ** kod JS, który jest dostarczony. Upewnij się, że wykonujesz tylko kod, który zamierzasz, sprawdzając, czy zmienne zawierają wartości/operatory, które możesz "zaufać". Wyobraź sobie, że jedna ze zmiennych zawiera coś w rodzaju 'alert ('gottcha!')' – Lix

7

lub użyć parseInt na ciąg, który będzie dodanie zmiennej do:

\t var x = 5; 
 
\t var y = 5; 
 
\t var p = '-'; 
 
\t var z = x + parseInt(p + y); 
 

 
$(".button").click(function(){ 
 
    alert(z); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="button">Click ME !</div>

+0

Ładne rozwiązanie nie używające 'eval' – Jivings

+0

sprytne, ale dość trudne do odczytania/utrzymania –

0

można użyć eval funkcję:

var x = 5; 
 
var y = 5; 
 
var p = '+'; 
 
var z = eval(x + p + y); 
 

 
alert(z);

+0

Jeśli chcesz zasugerować użycie' eval' - podaj odpowiednie ostrzeżenia o niebezpieczeństwach związanych z wykonywaniem niepożądanego kodu. – Lix

15

Unikaj eval, o ile to możliwe. W tym przykładzie, proste switch...case oświadczenie będzie wystarczająca:

var x = 5; 
var y = 5; 
var z; 
var p = "+"; 
switch (p) { 
    case "+": 
     z = x + y; 
     break; 
    case "-": 
     z = x - y; 
     break; 
} 

Można również korzystać z mapy funkcji:

var fnlist = { 
    "+": function(a, b) { return a + b; }, 
    "-": function(a, b) { return a - b; } 
} 
var x = 5; 
var y = 5; 
var p = "+"; 
var z = fnlist[p](x, y); 
+0

Naprawdę podoba mi się rozwiązanie mapy funkcyjnej ... Bardzo elegancko! – Lix