Javascript [JavaScript] differenza fra, if, else e else if?

Stato
Discussione chiusa ad ulteriori risposte.

Xalein

Utente Electrum
19 Giugno 2016
275
57
14
149
Ultima modifica:
ciao! sono un beginners, e non mi è ben chiara la differenza dei tre in titolo

if=se /positiva
else= se /negativa
else if= ???/ sarebbe per caso una condizione multipla negativa?
cioè non riesco a capire cosa diamine stia sbagliando:

http://imgur.com/a/gv3i8

ps: non mi è anche ben chiara la funzione del / nei caratteri, se ad esempio voglio scrivere console.log("dov/'era la mia gomma pane?") mi suggeriscono di utilizzare lo slash.. ma a che serve?
 
Ultima modifica:
if: controlla se la condizione tra parentesi è vera o falsa. Se vera esegue il blocco di codice (compreso tra parentesi graffe) che lo segue.
else: segue sempre un blocco di codice if. Se la condizione dell'if era falsa, viene eseguito il blocco di codice che lo segue. L'else è facoltativo, può esserci anche solo l'if.
else if: in realtà "non esiste" - si tratta di un else seguito da un nuovo if.
JavaScript:
if (condizione1) {
        /* blocco di codice 1 */
} else {
        /* blocco di codice 2 */
}
In questo caso, se condizione1 è vera, viene eseguito il blocco di codice 1; altrimenti viene eseguito il blocco di codice 2.
Se c'è una sola istruzione dentro ai blocchi di codice, allora non servono le parentesi graffe:
JavaScript:
if (condizione1)
        /* istruzione singola 1 */
else
        /* istruzione singola 2 */
Sfruttando questa proprietà è possibile "creare" l'else if. Infatti, un blocco if interno viene visto dal blocco esterno come fosse una singola istruzione. Ad esempio, se si scrive:
JavaScript:
if (condizione1)
        if (condizione2) {
                /* blocco di codice */
        }
Anche se blocco di codice contiene più di una istruzione, nell'if esterno non servono le parentesi graffe in quanto l'if interno viene visto da fuori come se fosse un'unica istruzione.
Quindi, è possibile fare così:
JavaScript:
if (condizione1)
        /* istruzione singola 1 */
else
        if (condizione2) {
                /* blocco di codice 1 */
        }
è possibile ora mettere il secondo if sulla stessa riga dell'else (l'interprete se ne frega di quante volte e dove torni a capo o meno), quindi:
JavaScript:
if (condizione1) {
        /* blocco di codice 1 */
} else if (codizione2) {
        /* blocco di codice 2 */
} else if (condizione3) {
        /* blocco di codice 3 */
} else {
        /* blocco di codice 4 */
}
(se i vari blocchi contengono una sola istruzione, si possono omettere le graffe)
Se la condizione1 è vera, allora viene eseguito il blocco di codice 1; altrimenti viene eseguito il blocco else, il quale contiene un altro if. In questo secondo if, se la codizione2 è vera, allora viene eseguito il blocco di codice 2; altrimenti viene eseguito il blocco else, il quale contiene un altro if. In questo terzo if, se la condizione3 è vera, allora viene eseguito il blocco di codice 3; altrimenti viene eseguito il blocco else e cioè il blocco di codice 4.
Volendo espandere i blocchi del precedente codice, verrebbe così (il codice è equivalente):
JavaScript:
if (condizione1) {
        /* blocco di codice 1 */
} else {
        if (codizione2) {
                /* blocco di codice 2 */
        } else {
                if (condizione3) {
                        /* blocco di codice 3 */
                } else {
                        /* blocco di codice 4 */
                } /* fine blocco else iniziato alla riga 9 (due righe sopra) */
        } /* fine blocco else iniziato alla riga 6 */
} /* fine blocco else iniziato alla riga 3 */
Vedi facilmente però, che mettere gli if sulla stessa riga degli else per formare degli else if rende il codice molto più leggibile. Per questo si fa.



Per quanto riguarda il tuo problema con il codice che hai postato, riscrivo qui il tuo codice formattandolo meglio:
JavaScript:
var moonPhase = "full";
if (moonPhase === "full") {
        console.log("Howwwlll");
} else {
        console.log("I swear I am not a werewolf...");
}
if (moonPhase === "full") ; }    /* <-- ERRORE: graffa chiusa senza nessuna aperta */
else if (moonPhase === "full") {
        console.log("Back on two feet");
} else {
        console.log("invalid moon phase");
}
(questo è semplicemente il codice che hai scritto te con qualche ritorno a capo in più e un po' di indentazione)
Il problema così si vede chiaramente (e te lo indica chiaramente l'errore dell'interprete). Nella riga 4 (riga 7 nel codice che ho riformattato io, l'ho marchiata con un commento) hai messo una parentesi graffa chiusa senza metterne una aperta prima. Quindi l'interprete non sa dove inizia il blocco dell'if. Inoltre, ci hai messo un punto e virgola senza alcuna istruzione (che non è un errore, ma ha poco senso).
In tutto ciò, hai usato gli if senza alcuna logica: nel primo if controlli se moonPhase è uguale a "full". Nel secondo if (quello dove c'è l'errore) controlli di nuovo la stessa cosa. Anche nell'else if controlli sempre la stessa cosa. Praticamente stai dicendo, tradotto in italiano: "se la fase lunare è 'full' allora fai questo altrimenti se la fase lunare è 'full' allora fai quest'altro". Non ha senso.
Giusto per farti capire la logica sbagliata: metti caso che alla riga dove c'è l'errore tu avessi messo anche la parentesi graffa aperta. Dentro le due parentesi nessuna istruzione (solo un punto e virgola) come hai fatto. Il risultato sarebbe stato:
> Se moonPhase fosse stato uguale a "full" avrebbe loggato questo:
Howwwlll
> Qualsiasi altro valore, diverso da "full", avesse assunto la variabile moonPhase, avrebbe loggato questo:
I swear I am not a werewolf...
invalid moon phase
Mentre la parte di codice dove logga "Back on two feet" non sarebbe mai stata raggiunta in nessuna situazione: infatti il codice nella seconda parte, prima controlla se moonPhase è uguale a "full" e se è così non fa niente (esegue l'istruzione vuota, quella con solo il punto e virgola) e poi termina (infatti dato che il primo if ha dato esito positivo e dopo ci sono solo else if e else, le condizioni sotto non vengono nemmeno verificate: "else" significa "altrimenti" e vengono controllate solo se le condizioni precedenti erano false). Mentre se moonPhase è diverso da "full" finisce per eseguire solo il codice nell'ultimo else, in quanto quello nell'else if ricontrolla la stessa cosa (se moonPhase == "full") che è ovviamente falsa (già controllata).
Scrivo il codice che dovrebbe essere corretto secondo il testo dell'esercizio, ma dovresti arrivarci facilmente da solo:
JavaScript:
var moonPhase = "..."; /* metti qualcosa qui */
if (moonPhase === "mostly full")
        console.log("Arms and legs are getting hairier");
else if (moonPhase === "mostly new")
        console.log("Back on two feet");
else
        console.log("Invalid moon phase");
Non ho messo le parentesi graffe, in quanto con un'unica istruzione per blocco non servono. Volendo metterle comunque sarebbe così:
JavaScript:
var moonPhase = "..."; /* metti qualcosa qui */
if (moonPhase === "mostly full") {
        console.log("Arms and legs are getting hairier");
} else if (moonPhase === "mostly new") {
        console.log("Back on two feet");
} else {
        console.log("Invalid moon phase");
}
Nel caso tu voglia aggiungere anche le fasi "full" e "new" (non mi sembra sia chiesto dall'esercizio però), sarebbe così:
JavaScript:
var moonPhase = "..."; /* metti qualcosa qui */
if (moonPhase === "full")
        console.log("Howwwlll");
else if (moonPhase === "mostly full")
        console.log("Arms and legs are getting hairier");
else if (moonPhase === "mostly new")
        console.log("Back on two feet");
else if (moonPhase === "new")
        console.log("I swear I am not a werewolf...");
else
        console.log("Invalid moon phase");
Ovviamente, puoi mettere le graffe se preferisci (ma, normalmente, quando c'è una sola istruzione, è buona norma di stile non metterle).
Cerca sempre di formattare il codice in modo leggibile, altrimenti poi è difficile trovare gli errori. Metti una e una sola istruzione per riga, e ogni volta che apri un nuovo blocco di codice, indenta tutto il codice al suo interno utilizzando il tasto TAB. Come ho fatto io in tutti i codici che ho postato in questo messaggio. Se non lo fai, gli errori non li troverai mai.




ps: non mi è anche ben chiara la funzione del / nei caratteri, se ad esempio voglio scrivere console.log("dov/'era la mia gomma pane?") mi suggeriscono di utilizzare lo slash.. ma a che serve?
Semmai il backslash (\) non lo slash (/). Lo slash non serve a niente, il backslash invece ti consente di usare caratteri speciali nelle stringhe. Puoi capirlo così: se provi a scrivere:
JavaScript:
var str = "Questa "parola" è racchiusa tra virgolette";
Come fa l'interprete a capire dove iniza e finisce la stringa? L'interprete ti darà errore, perché vedrà la stringa "Questa " seguita da parola (che però non è una istruzione valida in JavaScript), seguita a sua volta da un'altra stringa " è racchiusa tra virgolette". Per far si che l'interprete non confonda le virgolette di apertura e chiusura della stringa e le virgolette interne alla stringa, si può usare il blackslash - così:
JavaScript:
var str = "Questa \"parola\" è racchiusa tra virgolette";
In questo modo l'interprete sa che la stringa è una sola, con due caratteri virgolette all'interno.
Dato che il JavaScript le stringhe si possono introdurre anche con gli apici singoli oltre che con le virgolette, la stessa cosa vale con gli apici singoli:
JavaScript:
var str = 'Questa \'parola\' è racchiusa tra apici singoli';
Se però usi le virgolette (o gli apici singoli) per introdurre la stringa, dentro puoi usare gli apici singoli (o le virgolette) senza dover utilizzare il backslash:
JavaScript:
var str = "Questa 'parola' è racchiusa tra apici singoli, ma la stringa è racchiusa tra virgolette";
Il backslash si usa anche in altri casi: ad esempio, se scrivi "\n" dentro una stringa, il risultato è il ritorno a capo (stringa su due righe). Con "\t" puoi inserire un carattere tabulazione (tab). Con "\\" inserisci un backslash singolo. Esempio: "Riga numero 1.\nRiga numero 2." (il carattere "\n" porta il testo che segue su una nuova riga: se provi a stamparla o loggarla, vedi che ritorna a capo).
Nel tuo caso "dov/'era la mia gomma pane?" dato che la stringa è racchiusa tra virgolette e dentro usi un apice singolo, non hai bisogno di mettere il backslash, quindi basta scrivere:
"dov'era la mia gomma pane?"
Oppure, se vuoi usare apici singoli per la stringa:
'dov\'era la mia gomma pane?'

P.S.: come detto da Cricket sotto, Java e JavaScript sono due linguaggi totalmente differenti. L'unica cosa che hanno in comune è la radice del nome. Quindi ho spostato la tua discussione nella sezione corretta.
 
if(red) // Se è rosso
else if(green) // Se è verde, non rosso
else // Se non è né verde né rosso

Puoi considerare "else if" come due istruzioni differenti per semplicità:
"else" = altrimenti
if = se

else if(green) = altrimenti... se è verde { }
 
Stato
Discussione chiusa ad ulteriori risposte.