Programování v jazyce JavaScript Katedra softwarového inženýrství Fakulta informačních technologií České vysoké učení technické v Praze Pavel Štěpán, 2011 Operátory a příkazy BI-JSC Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti P. Štěpán PHP BI-PHP, výpis 3 1/6
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv="content-type" content="text/html; charset=utf-8"> </head> <body> <h1>operatory a prikazy jazyka</h1> <script type="text/javascript"> // vyrazy var i,j,k; // operator prirazeni = (Hodnotou operace je prirazovana hodnota, // asociativni zprava) i = j = k = 5; // i = (j = (k = 5)) // totez; // slozena prirazeni += -= >>=... (i += 2; // i = i + 2; ) aritmeticke operatory: + - * / % (modulo - zbytek po deleni) Specialni pravidla: - standardni; presahne-li vysledek rozsah, vrati se Infinity nebo -Infinity - neciselne hodnoty prevedeny pomoci fce Number. Nejde-li, vrati NaN - je-li nektery operand NaN, je vysledek NaN V nasledujicich prikladech plati standardni pravidla pro znamenka (jsou-li aplikovatelna) - Infinity*0 = NaN; Infinity*cislo = Infinity; (znamenko!); Infinity*Infinity = Infinity; - Infinity/Infinity = NaN; 0/0 = NaN; cislo/0 = Infinity; (znamenko) - Infinity/nenulove_cislo = Infinity; - Infinity + Infinity = Infinity; - Infinity + -Infinity = -Infinity; Infinity + -Infinity = NaN - je-li jeden operand souctu retezec, prevede se druhy na retezec (je-li treba) pomoci.tostring resp. String a ZRETEZI se!! - Infinity - Infinity = NaN; Infinity - -Infinity = Infinity;... - je-li jeden operand rozdilu objekt, ziska se ciselna hodnota pomoci metody valueof; neexistuje-li valueof, pouzije se tostring a retezec se prevede na cislo - Modulo: Infinity % cislo = NaN; Cislo % 0 = NaN; Infinity % Infinity = NaN; cislo % Infinity = cislo; 0 % hodnota = 0; unarni + a - Pro neciselne prevod na cislo (objekty se prevadeji pomoci valueof popr. tostring) unarni znamenka se pouzivaji pro prevody na cisla i = +true; // alert(i); // 1 P. Štěpán PHP BI-PHP, výpis 3 2/6
// inkrementace ++ a dekrementace -- // preincrement ++i a postincrement i++ // funguje i pro desetinna cisle (pricte/odecte 1); necislene // prevadi na cisla, objekty pomoci valueof resp tostring bitove operatory ~ (NOT), & (AND) (OR) ^ (XOR) << posun vlevo; >> posun vpravo aritmeticky - zachova znamenko >>> posun vpravo bezznamenkovy - zleva doplnuje nuly cislo prevede z desetinneho na 32 bit integer, provede operaci a konvertuje zpet; neciselne na cisla pomoci fce Number; NaN a Infinity prevede na 0!! i = "ABC"; j = i << 1; // alert(j); // 0 logicke operatory! && negace (!): ne-boolean prevede standardne na boolean a invertuje Specialni pravidla: - logicky soucin (&&): provadi "line" (lazy) vyhodnocovani: je-li prvni operand true, vrati druhy; je-li prvni false - vrati false a druhy NEVYHODNOCUJE!! specielne: - object && operand vrati druhy operand dalsi plati, pokud se prislusny operand vyhodnocuje (coz pro lazy pripad nemusi!!) - je-li jeden z operandu null, vrati null - je-li jeden z operandu NaN, vrati NaN - je-li jeden z operandu undefined, vrati undefined operator && tedy NEMUSI vracet hodnotu boolean logicky soucin ( ): opet line vyhodnocovani: je-li 1. operand true, druhy nevyhodnocuje specielne: - je-li 1. operand object, pak jej vzdy vrati - je-li 1. operand false, vrati druhy - jsou-li oba operandy null, vrati null - jsou-li oba operandy NaN, vrati NaN - jsou-li oba operandy undefined, vrati undefined // alert(null 1); // alert(null null); P. Štěpán PHP BI-PHP, výpis 3 3/6
relacni operatory < <= > >= - vraceji logickou hodnotu Specialni pravidla - cisla - standardni porovnani - je-li jeden operand cislo, druhy se prevede na cislo - retezce - porovnavaji se KODY odpovidajicich znaku v retezci!! - je-li jeden operand objekt, nejprve se zavola valueof (neni-li, tostring) a vysledek se porovna - operand Boolean se prevede na cislo a porovna se - NaN v relaci s cimkoli vrati false // alert("bara" < "anna"); // true - kod a > kod B // alert("1000" < "9"); // true - porovna znakove (ale pokud // by byl jeden operand cislo, porovna OK) // alert(i < NaN); // false // alert(i >= NaN); // take false porovnani == rovnost!= nerovnost === identicka rovnost!== identicka nerovnost Specialni pravidla identicka porovnani - napred se testuje typ a potom hodnota alert(1 === "1"); false - ruzne typy pro bezna neidenticka) porovnani se provadeji prevody typu: - Boolean se prevede na cislo - je-li jeden operand retezec a druhy cislo, pokusi se prevest retezec na cislo - je-li jeden operand objekt, vola se valueof; neni-li, tak tostring pravidla pro porovnani specialnich hodnot: - null a undefined se rovnaji - null a undefined se pro porovnani neprevadeji na jakoukoli jinou hodnotu - je-li jeden operand NaN, je vysledkem nerovnost (dokonce i pro NaN == NaN) - jsou-li oba operandy objekty, vrati true, pokud oba operandy odkazuji na tyz objekt // podminkovy operator i = (j > k)?j:k; // maximum // operator carka - vice operaci v jednom prikazu // (obvykle v deklaracích proměnných) var r = 2, s = 3, t = 4; // lze pouzit i v prirazeni - potom vraci posledni prvek vyrazu // (pouzitelne napr. pro vyuziti vedlejsich efektu) var x = (2,4,6,8,3); // 3 // alert(x); P. Štěpán PHP BI-PHP, výpis 3 4/6
// prikazy // podminkovy if (i > 0){ j = 2; k = 3; else { i = 8; k = 2; // cykly while i = 8; while (i > 0){ i--; i = 8; do { i--; while (i > 0); // cyklus for for (i = 0; i < 10; i++){ for (var n = 0; n < 20; n+=3){ // alert(n); // 21 - n je mozno pouzit i za cyklem - neni // lokalni v cyklu!! // cyklus for-in var clovek = new Object(); clovek.id = 3; clovek.krestni = "Franta"; clovek.prijmeni = "Novak"; var vlastnosti = ""; // projde vsechny vlastnosti (poradi neni urceno) for (var vlastnost in clovek){ vlastnosti += vlastnost + "='" + clovek[vlastnost] + "'; "; // alert(vlastnosti); P. Štěpán PHP BI-PHP, výpis 3 5/6
// break (opusteni cyklu) a continue (okamzite zahajeni dalsiho): n = 0; for (i = 1; i <= 20; i++){ if ((i % 5) == 0) continue; n++; // alert(n); // 16 - pro 5,10,15,20 se n nezvysilo // break a continue pro nekolik vnorenych cyklu n = 0; // oznaceni (pojmenovani) prikazu. Nejde o navesti, na ktere by // se provadel skok!! vnejsi: for (i = 0; i < 10; i++){ for (j = 0; j < 10; j++){ // pokracovat ZA cyklem jmenem vnejsi (podobne continue) if ((i == 3) && (j == 7)) break vnejsi; n++; // alert(n); // 37 // prikaz with "vytknuti pred zavorku". // Nedoporucuje se - spatny vykon, obtiznejsi ladeni with(clovek){ id = 9; krestni = "Eva"; prijmeni = "Cerna"; // alert(clovek.id + ";" + clovek.krestni + ";" + clovek.prijmeni); // prikaz vicenasobneho vetveni switch // pracuje pro vsechny datove typy; u case mohou byt vyrazy var roman = "x", arab; switch(roman){ case "i": arab = 1; break; case "v": arab = 5; break; case "x": arab = 10; break; default: arab = 0; </script> </body> </html> P. Štěpán PHP BI-PHP, výpis 3 6/6