Autor Zpráva
Ten levej
Profil *
Cau, potreboval bych vedet jestli se dá uložit operátor do proměnné a pak použít v početní operaci.
Např:
var operator = "+";
var operace = 3+operator+2;

Kdyz si to pak vypisu tak mi to hodi 3+2, ale ja chci aby to hodilo 5.

Diky
juriad_
Profil *
Primo ne. Ale muzes si napsat funkci.
var plus = function(a,b) {return a+b;}
A tu funkci mas v promenne plus. Pak staci tu funkci aplikovat na levy a pravy argument. var operace = plus(2, 3); // 5
Ten levej
Profil *
Jo to by slo, diky.
xROAL
Profil
Šlo by to s použitím evalu, avšak treba byť opatrný v tom, čo si do premenných pustíš.
Eval vykoná akýkoľvek kód, ktorý mu dáš ako keby je to normálne PHP normálny JS. Je pomalý a môže predstavovať aj bezpečnostné riziko (nie až v takej miere ako pri PHP, no aj tak). Je lepšie sa mu úplne vyhnúť.

Našiel som iný spôsob, ktorý vyzerá podstatne bezpečnejšie:
function add(a, b) {
  return a + b;
}

function multiply(a, b) {
    return a * b;
}

function divide(a, b) {
    return a / b;
}

var operations = {
    '+': add,
    '*': multiply,
    '/': divide
};

var a = 2;
var b = 5;
var operation = '+';

alert(operations[operation](a, b));
Pôvodný zdroj: StackOverflow

Upravené. Už je to v JS a nie PHP. Ospravedlňujem sa, asi som sa moc ponáhľal.
juriad_
Profil *
xROAL:
Bavime se tu o JS, ale nastesti tvuj prispevek je platny jen s minimalnimi zmenami. Ta nejvetsi je, ze v poli $operations by byly primo ty funkce a ne jen jejich nazvy.
xROAL
Profil
juriad:
Pardon, to som si nejako vôbec neuvedomil a hneď som Googlil možnosti v PHP.
Upravím pôvodný príspevok.
Joker
Profil
xROAL [#4]:
ad eval: Kromě uvedených nevýhod navíc pro něco na způsob kalkulačky eval ani není vhodný, protože jakmile mi přestane stačit +, -, *, /, nastanou potíže.

Jinak je otázka, jestli ten způsob s uložením funkce do proměnné má výhody proti klasickému řešení:
function vypocet(prvni, druhy, operator) {
  switch (operator) {
    case "+": 
      return prvni + druhy;
    case "-" : 
      return prvni - druhy;
    case "*": 
      return prvni * druhy;
    case "/": 
      return prvni / druhy;
  }
}
var a = 2;
var b = 5;
var operation = '+';
 
alert(vypocet(a, b, operation);

Tohle mi pro méně složité situace připadá snadné a přehledné.
Většinou asi nebude třeba to moc překombinovávat. I když by určitě šlo vyrobit „enterprise“ řešení se sadou tříd implementujících rozhraní IOperation a třídou OperationFactory :-)
1Pupik1989
Profil
Já bych to řešil přes prototype.

Number.prototype.add = function(b){
  return this+b;
};
Number.prototype.sub = function(b){
  return this-b;
};
Number.prototype.multiply = function(b){
  return this*b;
};
Number.prototype.divide = function(b){
  return this/b;
};


var result = (5).add(8).multiply(2);
alert(result);
Chamurappi
Profil
Reaguji na 1Pupika1989:
Já ne. Přišlo by mi to trošku praštěné :-)
Tvůj kód ukazuje, jak by šlo nahradit standardní matematické operátory, ale nikoliv, jak určit matematickou operaci pomocí jiné proměnné. To by se dělalo takto:
var operaceA = "add";
var operaceB = "multiply";
var result = (5)[operaceA](8)[operaceB](2);
Což vypadá ještě divněji. Tudy ne.


Reaguji na xROALa:
Šlo by to s použitím evalu
Cituji: „If the argument is an expression, eval() evaluates the expression. If the argument is one or more JavaScript statements, eval() executes the statements.“ – to není pravda, žádné rozhodování mezi příkazy a výrazy se neděje. Argument je vždy vyhodnocený, jako kdyby to byl celý skript.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: