Autor | Zpráva | ||
---|---|---|---|
Libor84 Profil |
#1 · Zasláno: 23. 12. 2008, 23:00:58
Čtu se knihu Objected oriented Javascript. Velmi pěkná všechno, ale nerozumím následujícímu tvrzení, že (přeloženo):
Pokud JS narazí na non-boolean výraz jako operand v logickém výrazu, je tento non-boolean vrácen jako výsledek. A pak jsou tam dva příklady: true || "něco" vrátí ale true, nikoli non-boolean "něco" -- PROČ?? NECHÁPU... true && "něco" vrátí "něco", čili non-boolean Může mi to někdo vysvětlit? |
||
Měsíček Profil |
#2 · Zasláno: 23. 12. 2008, 23:26:52 · Upravil/a: Měsíček
<script type="text/javascript"> /** * True je pravda a proto se do "a" přiřadí String. */ var a = true && "Kočka nežere peří."; // "Kočka nežere peří." /** * True je sice pravda, ale JS má možnost (kvůli operátoru ||) * přiřadit co chce, zde je první bool-výraz a proto zde bude true. */ var b = true || "Kočka nežere peří."; // "true" </script> |
||
Libor84 Profil |
#3 · Zasláno: 23. 12. 2008, 23:42:03
Já to stejně dál nechápu.... :-(
var a = true && "Kočka nežere peří."; Výsledek: a obsahuje "Kočka nežere peří." Umím si vysvětlit tak, že je tu prostě poučka "neboolean a boolean vrátí neeboolean", ale důvod nechápu. var b = true || "Kočka nežere peří."; Výsledek: b obsahuje true Chápu. Doufám.... Jakmile je první operand true v ORech, není potřeba nic dál vyhodnocovat, vrátím true. |
||
Libor84 Profil |
#4 · Zasláno: 23. 12. 2008, 23:47:44
A následně nechápu výrazy jako
var mynumber = mynumber || 10; které by se měli chovat: přiřadit 10, není-li definováno dosud, jinak původní hodnota... Nechápu! Vždyť výsledkem boolean výrazu může být jen znovu boolean! |
||
Libor84 Profil |
#5 · Zasláno: 23. 12. 2008, 23:51:57
Asi už chápu. Zkrátka: u obojích JS vrací non-boolean operand jako výsledek a basta...
Čili var a = a || 10 je vlastně a = (!!!a ? 10, a) |
||
ah01 Profil |
#6 · Zasláno: 24. 12. 2008, 00:04:44
&& je logické „a“, tedy aby byl výraz pravdivý, musí být pravdivé oba výrazy. Při vyhodnocování je třeba kouknou na první výraz, a pokud není pravdivý (vyhodnocen jako true), nemá cenu koukat dál, výsledek bude vždy nepravda, proto vrátí tento výraz. Pokud je pravdivý, musí se podívat na druhý výraz a ten vrátí.
|| je logické „nebo“, tedy aby byl výraz pravdivý, musí být první nebo druhý výraz pravdivý. Při vyhodnocování se podívá na první výraz, a pokud je pravdivý (vyhodnocen jako true) není třeba koukat dál, protože výsledek je pravdivý, proto vrátí tento výraz. Pokud je nepravdivý, musí se kouknout na druhý výraz a ten pak vrátí. Pak je dobré vědět jak funguje převod na boolean hodnotu. Tedy za false se považuje: false, null, undefined, "" (prázdná řetězec), 0 a NaN. true je všechno ostatní. |
||
Timy Profil |
#7 · Zasláno: 24. 12. 2008, 00:22:30 · Upravil/a: Timy
Obecně ANDy a ORy fungují takhle: Pokud máme n výrazů spojených dohromady ANDem (&&), AND vrátí poslední vyhodnocený výraz v případě, že jsou všechny výrazy pravdivé. Pokud je alespoň jeden výraz nepravdivý, vrátí false. OR vrátí první výraz, který se vyhodnotí na true. V případě, že se žádný prvek nevyhodnotí na true, vrátí false.
Toto chování je logické: ANDy i ORy se vyhodnocují líně, to znamená, že ve chvíli, kdy AND narazí na false, vyhodnocování končí. A ve chvíli, kdy OR vyhodnotí nějaký výraz na true, skončí taky, protože je zbytečné procházet dále. Hezky je to vidět třeba v těchto případech: <script> var ret = "asd"; if(ret && true && nesmysl) { alert("asd"); } </script> Kód se provede a vyhodí chybu, protože „nesmysl“ není deklarován. Když to ale napíšeme takhle, tak se kód provede, alert se sice neprovede, ale javascriptová konzole nevyhodí chybu, protože prohlížeč přestal vyhodnocovat podmínku ve chvíli, kdy narazil na false: <script> var ret = "asd"; if(ret && true && false && nesmysl) { alert("asd"); } </script> Pro zajímavost: pokud by jazyk podporoval aplikovat AND a OR s nulovým počtem argumentů, vrátil by AND true a OR false. Tedy — měl by vrátit :-). |
||
Leo Profil |
#8 · Zasláno: 24. 12. 2008, 13:20:03
Libor84
"Čtu se knihu Objected oriented Javascript." Neznam, presnejsi citace (autor, vydavatel,...) by nebyla? Diky, Leo |
||
Měsíček Profil |
#9 · Zasláno: 24. 12. 2008, 13:46:55
Reaguji na Lea:
"Neznam, presnejsi citace (autor, vydavatel,...) by nebyla? Diky, Leo" Možná myslí tu od Stoyana -> Object Oriented Javascript. |
||
Leo Profil |
#10 · Zasláno: 24. 12. 2008, 13:53:58
|
||
Měsíček Profil |
#11 · Zasláno: 24. 12. 2008, 14:03:15 · Upravil/a: Měsíček
|
||
Libor84 Profil |
#12 · Zasláno: 24. 12. 2008, 16:04:25
Když se na to ptáte tak to bylo opravdu OOP JS od Stefanova vydaná Pact Publishingem (http://www.amazon.com/Object-Oriented-JavaScript-high-quality-applica tions-libraries/dp/1847194141).
JavaScript a Ajax Moderní programování webových aplikací od CPressu mám a přijde mi jako strašná.... I přesto že John Resig je uznávaná osobnost... Překlad je ještě horší. Česky jsem to ani nemohl číst a musel sáhnout po originálu. Dobrá by mohla být nová kniha, co nedávno vydal Peter-Paul Koch (http://www.quirksmode.org/book). |
||
Leo Profil |
#13 · Zasláno: 24. 12. 2008, 16:14:25 · Upravil/a: Leo
Me Resig prijde jako jedina knizka krome Flanagana, ktera je k necemu (i kdyz pravda pouzity cestin je divny). A krome nich asi uz jen
JavaScript: The Good Parts, Douglas Crockford, ale tu jsem jeste nevidel. "Dobrá by mohla být nová kniha, co nedávno vydal Peter-Paul Koch (http://www.quirksmode.org/book)." Koch se ovsem chlubi pokud vim tim, ze OOP nikdy v JS nepotreboval. Leo |
||
Časová prodleva: 15 let
|
0