Javacript utilizza la valutazione di corto circuito per operatori logici ||
e &&
. Tuttavia, è diverso da altre lingue in quanto restituisce il risultato dell'ultimo valore che ha interrotto l'esecuzione, anziché un valore true
o false
.
I seguenti valori sono considerati falsi in JavaScript.
- falso
- nullo
""
(stringa vuota)
- 0
- Nan
- non definito
Ignorando le regole di precedenza dell'operatore e mantenendo le cose semplici, i seguenti esempi mostrano quale valore ha interrotto la valutazione e, di conseguenza, viene restituito.
false || null || "" || 0 || NaN || "Hello" || undefined // "Hello"
I primi 5 valori fino a NaN
sono falsi, quindi vengono tutti valutati da sinistra a destra, fino a quando non incontra il primo valore di verità - il "Hello"
che rende vera l'intera espressione, quindi qualsiasi cosa più in alto non verrà valutata e "Hello"
verrà restituita come risultato dell'espressione . Allo stesso modo, in questo caso:
1 && [] && {} && true && "World" && null && 2010 // null
I primi 5 valori sono tutti veritieri e vengono valutati fino a quando non soddisfano il primo valore falsy ( null
) che rende l'espressione falsa, quindi 2010
non viene più valutata e null
viene restituita come risultato dell'espressione.
L'esempio che hai fornito è l'utilizzo di questa proprietà di JavaScript per eseguire un compito. Può essere utilizzato ovunque sia necessario ottenere il primo valore di verità o falsità tra un insieme di valori. Questo codice di seguito assegnerà il valore "Hello"
in b
quanto semplifica l'assegnazione di un valore predefinito, invece di eseguire controlli if-else.
var a = false;
var b = a || "Hello";
Potresti chiamare l'esempio seguente uno sfruttamento di questa funzionalità e credo che renda il codice più difficile da leggere.
var messages = 0;
var newMessagesText = "You have " + messages + " messages.";
var noNewMessagesText = "Sorry, you have no new messages.";
alert((messages && newMessagesText) || noNewMessagesText);
All'interno messages
dell'avviso, controlliamo se è falso, e se sì, quindi valutiamo e restituiamo noNewMessagesText
, altrimenti valutiamo e restituiamo newMessagesText
. Dato che in questo esempio è falso, ci fermiamo a noNewMessagesText e avvisiamo "Sorry, you have no new messages."
.
$f=$a or $f=$b or $f=$c; // etc
. PHP ha sia l'||
operatore che l'or
operatore, che svolgono lo stesso lavoro; tuttaviaor
viene valutato dopo l' assegnazione mentre||
viene valutato prima. Questo ti dà anche lo stile perlish di$a=getSomething() or die('oops');