Autor Zpráva
Libor84
Profil
Č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
<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
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
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
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
&& 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
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
Libor84

"Čtu se knihu Objected oriented Javascript."

Neznam, presnejsi citace (autor, vydavatel,...) by nebyla? Diky, Leo
Měsíček
Profil
Reaguji na Lea:

"Neznam, presnejsi citace (autor, vydavatel,...) by nebyla? Diky, Leo"

Možná myslí tu od Stoyana -> Object Oriented Javascript.
Leo
Profil
A je tam neco vic, nez v tehle: http://knihy.cpress.cz/Book.asp?ID=3196 ?

Leo
Měsíček
Profil
Tahle ala takhle? Nejspíše tam toho více nebude.
Libor84
Profil
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
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

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:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0