Autor Zpráva
BuGeR
Profil
Zdravím.
Prosím, existuje nějaka funkce, která by automaticky spočítala matematicky obsah proměnné?
Mám například proměnnou:
var priklad = "10+15";

Lze z tohoto, nějakou funkci dostat výsledek (tedy číslo 25)?
Možná jsem to formuloval, divně, snad to pochopíte :).
Díky, B.
Keeehi
Profil
var priklad = eval("10+15");
Bude to však fungovat jen s jednoduchými operacemi.
BuGeR
Profil
Díky! :)
Witiko
Profil
Keeehi:
Dovoluju si nesouhlasit, eval vyhodnotí jakkoliv rozsáhlý String obsahující javascriptový kód, ačkoliv při správném návrhu není vůbec potřeba ho používat.

Stačí použít
var priklad = 10+15;


A ještě se ušetří volání funkce.
Keeehi
Profil
Witiko:
1. Předpokládal jsem, že BuGeR není úplný pitomec, co by neuměl sečíst dvě čísla a tudíž ty uvozovky tam napsal schválně. Třeba chce vytvořit jakousi kalkulačku a výraz bere z inputu.
2. Výraz 15+|-15| to však nezvládne. Ano, Math.abs znám, ale bude ho znát i ten kdo bude ten výraz do inputu psát?
Witiko
Profil
Keeehi:
Pak stačí BuGeRovi říct, jak eval() funguje - že převádí javascriptový kód z textu na funkci a spouští jej. Není nutné mlžit tím, že to bude však fungovat jen s jednoduchými operacemi. Koneckonců, předpokládáme přece, že BuGeR není úplný pitomec. :)
_es
Profil
Witiko:
eval() funguje - že převádí javascriptový kód z textu na funkci a spouští jej
eval neprevádza kód na funkciu. Pracuje tak, ako keby sa ten text nachádzal priamo v kóde ako kód. Vyskúšaj dať do JS odkazu do funkcie eval príkaz return.
To však narušuje niektoré optimalizácie, preto budú niektoré prehliadače mať možnosť striktného režimu JS (odkaz1, odkaz2).

Dovoluju si nesouhlasit, eval vyhodnotí jakkoliv rozsáhlý String obsahující javascriptový kód, ačkoliv při správném návrhu není vůbec potřeba ho používat.
Ak sa jedná o kalkulačku, ako odhaduje Keeehi, tak to bez funkcie eval asi veľmi nepôjde. Jediná alternatíva, čo ma napadá, je meniť obsah elementu script, alebo ho dynamicky vytvárať. Alebo použiť tiež nedoporučované konštrukcie typu new Function("return " + reťazec)().

Keeehi:
Výraz 15+|-15| to však nezvládne. Ano, Math.abs znám, ale bude ho znát i ten kdo bude ten výraz do inputu psát?
Na skrátený zápis pre objekt Math sa dá použiť príkaz with. Zápis abs(sin(7*PI)) je pre kalkulačku predsa len vhodnejší než Math.abs(Math.sin(7*Math.PI)).
Witiko
Profil
_es:
Pokud jde o kalkulačku, tak se nejspíš nejedná o žádné "vážné" použití a eval() je možné použít. Ačkoliv by samozřejmě bylo možné obsah inputu rozparsovat a rekurzivní funkcí spočítat, čímž by se otevřela cesta i pro podporu 15+|-15|.

eval neprevádza kód na funkciu
Představoval jsem si nějakou takovouto implementaci ;)
function eval(text) {
  text = text.replace(/return[^;]*;/g,"");
  text = text.split(/\n|;/);
  text[text.length-1] = "return " + text[text.length-1];
  for(var index = 0; index < text.length; index++) {
    if(index == text.length-1)
      return new Function(text[index])()
    else new Function(text[index])();
  }
}


Ok, ok, já vím. To rozparsování naprosto nerespektuje privátní proměnné a víceřádkovou definici textu. :)
_es
Profil
Witiko:
čímž by se otevřela cesta i pro podporu 15+|-15|
Len či nie oveľa komplikovanejšie a pomalšie, s náchylnosťami na chyby…
Okrem toho by bolo náročné zisťovanie, kde znak | znamená počiatočnú a kde koncovú značku, ak by tých znakov bolo viac ako dva.
Witiko
Profil
_es:
No však říkám, že by to bylo třeba rozparsovat, nakonec by nám vzniknul takový client-sided TeX. :)
Jinak na kalkulačku, kde se počítá s jednoduchými rovnicemi / znalostí javascriptu u pisatele je eval asi tím menším zlem, jen bych ho obalil do try{} a možná i ten vyhodnocovaný řetězec samotný eval("try{" + text + "}catch(e){}"), pokud by ta výjimka nechtěla vybublat ven, což se také občas stává.

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: