740 likes | 907 Views
Elementi del linguaggio. Stefano Bistarelli Thanks to Roberto Bruni e Daniela Giorgetti. Commenti. Come in C, C++ e Java es. // singola linea di commento /* commento su una, due, o più righe */. Identificatori. iniziano con una lettera o underscore “_”
E N D
Elementi del linguaggio Stefano Bistarelli Thanks to Roberto Bruni e Daniela Giorgetti
Commenti • Come in C, C++ e Java • es. // singola linea di commento /* commento su una, due, o più righe */ Stefano Bistarelli
Identificatori • iniziano con una lettera o underscore “_” • i caratteri seguenti possono essere lettere, cifre e undescore • assolutamente vietati gli spazi! • lettere vuol dire a—z, A—Z • cifre vuol dire 0—9 • attenzione alla maiuscole/minuscole • certe parole sono però riservate Stefano Bistarelli
Parole chiave (riservate) • Abstract • boolean • break • byte • case • catch • char • class • const • continue • debugger • default • delete • do • double • else • enum • export • extends • false • final • finally • float • for • function • goto • if • implements • import • in • instanceof • int • interface • long • native • new • null • package • private • protected • public • return • short • static • super • switch • synchronized • this • throw • throws • transient • true • try • typeof • var • void • volatile • while • with Stefano Bistarelli
Interi • decimali: • es. 33 1234567890 • ottali (base 8, iniziano con zero): • es. 033 01234567 • esadecimali (base 16, iniziano con zero e x): • es. 0x33 0X123456789abcdef 0XABCDEF Stefano Bistarelli
Floating Point (virgola mobile) • numeri decimali con parti frazionarie • notazione standard: • es. 2405.673 -1.958 • notazione scientifica: • es. 8.3200e+11 8.3200e11 9.98E-12 Stefano Bistarelli
Booleani • valori possibili: truefalse • rappresentano rispettivamente i valori booleani 1 e 0 Stefano Bistarelli
Stringhe • letterali di 0 o più caratteri racchiusi tra virgolette doppie (“) o singole (‘) • “La macchina di Carlo” • ‘ comunità \“virtuali\” ’ • “#@12-34” • Caratteri speciali: • \’ (apice singolo) \” (apice doppio) • \b (backspace) \f (form feed) • \n (interruzione di linea) \r (ritorno carrello) • \t (tabulazione) \\ (backslash) Stefano Bistarelli
Dichiarazioni di variabili • Parola chiave var • es: • var indirizzoEmail; • var n; • var i, j, k; • Usate il “;” finale Stefano Bistarelli
Assegnamenti • Si può inizializzare una varibile quando si dichiara (ma non è obbligatorio) • es: • var indirizzoEmail = “bista@sci.unich.it”; • var n = 0.00; • var i = 1, j = 1, k; • var isMouseOverLink = false; • r=0; Stefano Bistarelli
Tipi • number (sia interi che reali) • (es. –12 3.14159) • boolean • (es. true false) • string • (es. “buongiorno!”) • function (metodi, se associate ad oggetti) • (es. write) • object • (es. window document null) Stefano Bistarelli
Dinamicità dei tipi • NON devono essere dichiarati esplicitamente • JS associa il tipo a seconda dell’ultimo valore assegnato alla variabile • es: var carLength; carLength=4+5; document.writeln(carLength); carLength=“5 metri”; document.writeln(carLength); Stefano Bistarelli
Scoping • L’area del programma in cui una variabile può essere usata • nessuna differenza se la variabile è dichiarata nella head piuttosto che nel body: è considerata globale • se la variabile è dichiarata all’interno di una funzione allora è locale (creata alla chiamate della funzione, distrutta all’uscita) • meglio dichiarare le variabili globali nella head Stefano Bistarelli
Costanti • variabili… che non variano!! • hanno sempre lo stesso valore durante qualsiasi esecuzione dello script • costanti built-in rappresentano i più comuni valori matematici (accedibili attraverso l’oggetto math) • non vengono dichiarate come tali, e quindi non c’è modo di garantire che si comportino “bene” Stefano Bistarelli
Espressioni • sequenza di letterali che viene valutata ad un valore • il valore di ritorno viene catalogato da JS come uno dei tipi base (boolean, number, string, function e object) • es. l’assegnamento x=10 restituisce il valore 10 • provate document.writeln(x=10); Stefano Bistarelli
Operatori aritmetici • x + y (somma) • x – y (sottrazione) • x * y (moltiplicazione) • x / y (divisione) • ++i oppure i++ (incrementano i, ma attenzione al valore restituito…) • --i oppure i-- (decrementano i, ma attenzione al valore restituito…) • -i (nega il valore) • x % y (modulo, ovvero il resto della divisione) Stefano Bistarelli
Operatori di confronto • restituiscono booleani • x == y (testa l’uguaglianza) • x != y (testa la non uguaglianza) • x > y (maggiore di) • x >= y (maggiore o uguale a) • x < y (minore di) • x <= y (minore o uguale a) Stefano Bistarelli
Operatori su stringhe • s + t (concatenazione) • tutti gli operatori di confronto visti Stefano Bistarelli
Attenzione ai tipi! • Fino a JS1.1 il confronto 7==“7” restituiva true!! • Infatti JS usa un casting automatico della stringa “7” nel valore 7 prima del confronto • In JS1.2 il casting è compito del programmatore • Esempi: per x=“3” e y=7: • In JS1.0 e 1.1 si ha x==3 : true e y==“7” : true • In JS1.2 si ha x==3 : false e y==“7” : false • In JS1.3+ si ha x==3 : true e y==“7” : true • Ovunque si ha x-0==3 : true e “”+y==“7” : true • In JS1.3+ si può usare === (controlla valori E tipi) Stefano Bistarelli
Casting • Da interi a stringhe: • “”+x “”+123 • Da stringhe a interi : • parseInt(“44 gatti”) restituisce il valore 44: • Da stringhe a floating-point: • parseFloat(“123.44 euro”) Stefano Bistarelli
Operatori bitwise • Lavorano sui bit che rappresentano il dato • 0110 & 1100 restituisce 0100 (in binario) • equivale a dire che 6&12 restituisce 4 • 0110 | 1100 restituisce 1110 (in binario) • equivale a dire che 6|12 restituisce 14 • 0110 ^ 1100 restituisce 1010 (in binario) • equivale a dire che 6^12 restituisce 10 • x << y (shift) equivale a x * 2y (se y0) • x>>y (shift verso destra) • x>>>y (shift verso destra con riempimento di 0) Stefano Bistarelli
Operatori di assegnamento • x = expr; • e 11 combinazioni con op. aritmetici o bitwise • x += y; sta per x = x+y; • x -= y; sta per x = x-y; • x *= y; sta per x = x*y; • x /= y; sta per x = x/y; • x %= y; sta per x = x%y; • x <<= y; sta per x = x<<y; • x >>= y; sta per x = x>>y; • x >>>= y; sta per x = x>>>y; • x &= y; sta per x = x&y; • x |= y; sta per x = x|y; Stefano Bistarelli
Operatori booleani • Agiscono su valori logici • x && y (AND logico) • x || y (OR logico) • !x (NOT logico) • vengono valutate da sinistra verso destra es. true || funzione_complicata(x) true senza calcolare la funzione “complicata” Stefano Bistarelli
Operatori condizionali • Analogo al consueto comando strutturato if_else: • (condizione) ? expr1 : expr2 • restituisce la valutazione di expr1 se condizione è vera, altrimenti restituisce la valutazione di expr2 • expr1 e expr2 possono avere tipi diversi Stefano Bistarelli
Operatore typeof • Aggiunto con JS1.1. • restituisce (come stringa) il tipo dell’argomento sul quale si sta lavorando • typeof parseInt restituisce la stringa “function” • typeof undefinedVariable restituisce “undefined” • typeof 33 restituisce “number” • typeof “Ciao” restituisce “string” • typeof true restituisce “boolean” • typeof null restituisce “object” Stefano Bistarelli
Trucchetto • Volete valutare un’espressione complessa? • digitate “javascript:espressione” nella barra di navigazione di I.E. e osservate il risultato nella pagina… Stefano Bistarelli
Facciamo uno script I • Supponiamo di voler visualizzare ora e data • Siccome lo script viene eseguito dal browser, data e ora saranno relative all’utente, oppure • UTC (Universal Coordinated Time), che è il nuovo nome per il vecchio GMT (Greenwich Mean Time) standard. <html> <head><title>Ora e Data</title></head> <body> … <script> … </script> </body></html> Stefano Bistarelli
Facciamo uno script II <script language=“JavaScript”> <!-- // --> </script> Stefano Bistarelli
Facciamo uno script III <script language=“JavaScript”> <!-- var ora = new Date(); // ora e’ un oggetto con ora e data correnti // --> </script> Stefano Bistarelli
Facciamo uno script IV <script language=“JavaScript”> <!-- var ora = new Date(); // ora e’ un oggetto con ora e data correnti var ora_locale = ora.toString(); var ora_UTC = ora.toGMTString(); // variabili di tipo stringa (formato leggibile) // --> </script> Stefano Bistarelli
Facciamo uno script V <script language=“JavaScript”> <!-- var ora = new Date(); // ora e’ un oggetto con ora e data correnti var ora_locale = ora.toString(); var ora_UTC = ora.toGMTString(); // variabili di tipo stringa (formato leggibile) document.write(“<p><b>Ora locale:</b> ”+ora_locale + “<br />”); document.write(“<b>Ora UTC:</b> ” + ora_UTC + “</p>”); // visualizzano i dati sulla pagina // --> </script> Stefano Bistarelli
Facciamo uno script VI <body> <h1>Ora e Data Correnti</h1> </body> </html> Stefano Bistarelli
Facciamo uno script VII <body> <h1>Ora e Data Correnti</h1> <script type=“text\javascript”> <!-- var ora = new Date(); var ora_locale = ora.toString(); var ora_UTC = ora.toGMTString(); document.write(“<p><b>Ora locale:</b> ”+ora_locale + “<br />”); document.write(“<b>Ora UTC:</b> ” + ora_UTC + “</p>”); // --> </script> </body> </html> Stefano Bistarelli
Facciamo uno script VIII • Testiamo lo script • Modifichiamo lo script • aggiungiamo un “orologio” più compatto var ore = ora.getHours(); var minuti = ora.getMinutes(); var secondi = ora.getSeconds(); document.write(“<font size=‘+5’>”); document.write(ore+“:”+minuti+“:”+secondi); document.write(“</font>”); Stefano Bistarelli
Facciamo uno script IX • Causiamo un errore document.write(“</font>”); • A seconda del browser: • Riceviamo un messaggio di errore • No? Meglio configurare il browser affinché ci aiuti… • in IE4+ selezionare tools->InternetOptions e in Advanced deselezionare Disable script debugging e selezionare Display a notification about every script error • in NN4.5+ scrivere javascript: nella barra di navigazione e comparirà una console JavaScript con un’indicazione più precisa dell’errore (e’ anche possibile impostarla automaticamente dalle preferenze). La console ci permette di eseguire dei comandi interattivamente per debuggare più facilmente. • Meglio avere anche NN in fase di testing delle pagine! Stefano Bistarelli
Quiz riassuntivi I • Quali delle seguenti parole sono identificatori validi? • _mia_Var_12 • 12varMia • typeof • pippo&pluto • Come si dichiara una costante in JS? • Non si può • Basta non usare var • con il comando x typeof constant • Se x=5 Quali risultati ritornano le seguenti espressioni? • x==“5” ? true false dipende dal browser • (parseInt(“5gatti”)==x)?1:2 ? 1 2 dipende dal browser • x=15 ? 5 15 false null • x++ ? 5 6 7 • “1”+x ? “15” 6 null dipende dal browser Stefano Bistarelli
Quiz riassuntivi II • Perché conviene avere anche NN oltre che IE? • Perché è gratuito • Per testare le pagine sotto browser diversi • Perché agevola il debugging • Perché è più semplice da usare • Il comando new Date() restituisce: • Un oggetto con ora e data correnti sul server dove risiede la pagina • Un oggetto con ora e data correnti sul client dove gira il browser • Un oggetto con ora e data dell’ultima modifica alla pagina • Una stringa con ora e data correnti sul server dove risiede la pagina • Una stringa con ora e data correnti sul client dove gira il browser • Una stringa con ora e data dell’ultima modifica alla pagina • Un intero rappresentante il numero di millisecondi trascorsi dalla data 1 Gennaio 1970 • La data del compleanno di Bill Gates Stefano Bistarelli
Esercizi Stefano Bistarelli
Comandi condizionali: if_else • Sintassi 1: • if (condizione) {comandi} • es. if (7!=“7”) {document.write(“JS1.2”)} • Sintassi 2: • if (condizione) {comandi} else {comandi} • es. if (7!=“7”) {vers=“1.2”} else {vers=“1.3”} Stefano Bistarelli
Funzioni • Racchiudono blocchi di istruzioni • Rendono possibile il riuso di funzionalità particolari in più punti dello script • Devono essere dichiarate!! (possibilmente nella head) Stefano Bistarelli
Funzioni • Non occorre dichiarare il tipo • return è facoltativo • Sintassi function nomefunzione (argomenti) { comandi } • es. function lascia_o_raddoppia (n) { if (n==1) {return 0} else {return 2*n} } Stefano Bistarelli
Nomi di funzione • I nomi delle funzioni vengono visti come identificatori • in questo modo l’invocazione di funzione viene vista come applicazione dell’operazione _( _ ) all’identificatore di funzione e agli argomenti che vengono passati: es. f ( a,b,c ) • Attenzione a non usare lo stesso nome per una funzione ed una variabile • Meglio dichiararle sempre nella head Stefano Bistarelli
Argomenti di funzione • Il passaggio avviene per valore (ma passando oggetti, si dà la possibilità di modificarne le proprietà) • Possono essere passati più argomenti di quelli specificati nella definizione della funzione. E anche di meno. • Per accedere a tutti gli argomenti passati si può usare (nel corpo della funzione): nomefunzione.arguments[n] • variando n. Stefano Bistarelli
Variabili globali e locali • Le variabili definite al di fuori di funzioni sono globali (possono essere accedute da tutte le funzioni a meno che venga introdotta una variabile locale con lo stesso nome). • Le variabili definite all’interno dei blocchi funzione (e gli argomenti delle funzioni) sono invece locali. Stefano Bistarelli
var x=10, y=20, z=30; function cambia(x) { x=1; y=2; var z=3; } cambia(x); document.write(x); document.write(y); document.write(z); 10 2 30 Stefano Bistarelli
Funzioni dentro funzioni • Si possono dichiarare funzioni ricorsive e mutuamente ricorsive (ovvero una funzione che contiene chiamate alla funzione stessa) • Esempio: Fattoriale (classico dei classici) • Però non si può definire una funzione all’interno di un’altra funzione (tutte definite allo stesso livello) Stefano Bistarelli
Facciamo uno script I • Usiamo il comando condizionale e quello che abbiamo imparato sulle funzioni per costruire una pagina che: • proponga una lista di siti numerati progressivamente; • chieda all’utente di scegliere il numero del sito che vuole visitare; • apra la pagina del sito; Stefano Bistarelli
Facciamo uno script II <head> … <script language=“JavaScript”> <!-- function sito(numero) { if (numero == 1) { return “http://www.netscape.com”; } if (numero == 2) { return “http://www.microsoft.com”; } if (numero == 3) { return “http://www.yahoo.com”; } if (numero == 4) { return “http://www.google.com”; } alert(“Scelta inesistente: Riprova!”); return “sitiNumerati.html”; } // --> </script> </head> Stefano Bistarelli
Facciamo uno script III <body> <h1>Ecco l'elenco dei tuoi siti preferiti</h1> <ol><li>Netscape</li> <li>Microsoft</li> <li>Yahoo</li> <li>Google</li></ol> <script language=“JavaScript”> <!-- var scelta = prompt(“Dove vuoi andare oggi?”,1); scelta = parseInt(scelta);//nota uso di parseInt!! window.location = sito(scelta);//nota il nuovo metodo!! // --> </script> </body> Stefano Bistarelli