Autor | Zpráva | ||
---|---|---|---|
BuGeR Profil |
#1 · Zasláno: 20. 10. 2010, 22:03:54
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 |
#2 · Zasláno: 20. 10. 2010, 22:09:34
var priklad = eval("10+15"); |
||
BuGeR Profil |
#3 · Zasláno: 20. 10. 2010, 22:13:12
Díky! :)
|
||
Časová prodleva: 3 dny
|
|||
Witiko Profil |
#4 · Zasláno: 23. 10. 2010, 20:58:15
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 |
#5 · Zasláno: 23. 10. 2010, 21:10:33 · Upravil/a: Keeehi
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 |
#6 · Zasláno: 23. 10. 2010, 21:17:18 · Upravil/a: Witiko
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 |
#7 · Zasláno: 23. 10. 2010, 21:52:24 · Upravil/a: _es
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 |
#8 · Zasláno: 23. 10. 2010, 22:31:25 · Upravil/a: Witiko
_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 |
#9 · Zasláno: 23. 10. 2010, 22:54:53
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 |
#10 · Zasláno: 24. 10. 2010, 14:31:16 · Upravil/a: Witiko
_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á. |
||
Časová prodleva: 14 let
|
0