18 struttura selettiva (IF … ELSE) ampliamenti
Vediamo una versione alternativa della funzione isUpperCaseChar vista nella lezione precedente che ho rinominato in isUooerCaseCharVersione1:
function isUpperCaseCharVersione1(carattere) { if( String(carattere) === String(carattere).toUpperCase() ) {return true;} else {return false;} }
Nella nuova variante vogliamo utilizzare gli operatori di confronto (maggiore e minore) sul carattere “A” e l’ultimo la “Z” per vedere se la lettera inserita è compresa nell’alfabeto maiuscolo
function isUpperCaseChar(carattere) { if(carattere>="A" && carattere<="Z") {return true;} else {return false;} }
Gli operatori relazionali (<,<=,=,=>,>) funzionano non solo tra numeri o espressioni, ma anche tra stringhe. Questo confronto viene detto lessicografico (ordine alfabetico) e funziona anche su intere stringhe (confrontando l’iniziale): “MAMMA” < “PAPA” e “MatEra” è minore di “MatTone”.
Nel nostro esempio il parametro carattere corrisponde ad una lettera ( passato da nome[0] ), quindi confronto il carattere ricevuto se è maggiore o uguale alla lettera A maiuscola.
Operatori logici
L’altro operatore da prendere in esame è AND && che rende la nostra espressione composta, cioè entrambi i confronti devono essere veri, quindi per essere vere la nostra espressione deve ricevere un carattere compreso nell’alfabeto maiuscolo.
Se volessimo esprimere il confronto: la lettera non è nell’alfabeto maiuscolo potremmo usare
carattere < "A" || carattere > "Z"
In questo caso l’operatore logico è OR || . La lettera o è minore della A o è maggiore della Z, basta che sia verificata uno dei 2 confronti. Altro modo:
! (carattere >= "A" && carattere <= "Z")
Operatore di negazione NOT ! qui le parentesi sono importanti, in quanto tutta l’espressione viene valutata e poi negata. Ecco u
eta >=5 && eta<=12 || eta>65
età compresa tra5 e 12 o maggiore di 65 , magari per una promozione di sconto, nel dubbio gestire le priorità usiamo le parentesi
(eta >=5 && eta<=12) || eta>65
e si può valutare anche le stringhe
(eta >=5 && eta<=12) || eta>65 || categoria === "militare"
includes
Una nuova variante della funzione isUpperCaseChar (l’altra rinominiamola in versione2) che utilizza il metodo includes, novità rispetto a ES5 che prevede indexOf, più scomodo da usare in questa situazione (restituisce la posizione della sottostringa oppure -1 se non presente):
if ( “ABCD..”.indexOF(carattere)>-1)…
function isUpperCaseChar(carattere) { if("ABCDEFGHIJKLMNOPQRSTUVWYZ".includes(carattere)) {return true;} else {return false;} }
includes cerca all’interno della stringa se è presente il carattere
Un quarto modo potrebbe essere quello di usare le espressioni regolari, ma lo approfondiremmo forse in una lezione separata.
Un quinto modo, da masochisti:
if(carattere==="A" || carattere==="B" || carattere="C" //eccetera)
short evaluation
if (3===3 || fuffa==="xyz")
Il programma non valuterà nemmeno la presenza di fuffa perché la prima espressione è vera e OR esclude la seconda e non restituirà nessun errore sul fatto che fuffa non è definita.
if (3===2 && fuffa==="xyz")
Anche qui la seconda espressione non viene vista perché la prima è falsa e l’AND esclude la seconda
if (5===4) if (3===3) alert("A"); else alert("B");
In questo caso l’else viene abbinato al secondo if, quindi non viene stampato nessun messaggio. Il modo corretto è usare le graffe
if (5===4) { if (3 === 3) {alert("A");} } else {alert("B");}
valori considerati sempre falsi
if(false) {alert("non sarò stampato");} // ovviamente è già false if(fuffa) {alert("non sarò stampato");} // undefined , genera errore if(null) {alert("non sarò stampato");} // // il null è false if(0) {alert("non sarò stampato");} // lo zero è false if(0/0) {alert("non sarò stampato");} // NaN espressione speciale NOT A NUMBER if("") {alert("non sarò stampato");} // stringa nulla ha valore false
negando ogni espressione di prima sarà considerata true
Una stringa è un valore quindi TRUE
if("ciao") //restituisce true