In poche parole - è così che è definito &&
. In Javascript, a && b
restituisce a
se a
è falsy e b
se a
è vero.
Viceversa a || b
rendimenti a
se a
è truthy e b
se a
è falsy.
Questo ha un senso intuitivo - se a
è falso in a && b
, allora perché preoccuparsi di leggere il resto dell'espressione? Sai già che l'intera faccenda è falsa. Quindi restituisci solo false. Ma Javascript prende la decisione di restituire a
, che è falsy, invece di costituire il valore false
per tornare dal nulla.
Questo è basato sulla valutazione di cortocircuito comune a tutti i linguaggi in stile C.
Consente molta espressività in Javascript. Per esempio questo modello:
var foo = function(opts) {
opts = opts || {}
// ...
}
implementa un parametro opzionale opts
. Se opts
non viene inoltrato affatto, opts = opts || {}
imposta opts
su {}
, quindi il resto del codice non deve sapere che opts
non è stato passato.
In-lunga mano è equivalente al seguente:
var x = a || b; // is equivalent to
var x;
if(a) {
x = a;
}
else {
x = b;
}
e
var y = a && b; // is equivalent to
var y;
if(!a) {
y = a;
}
else {
y = b;
}
Pertanto JavaScript può essere molto più conciso di C o Java, in quanto semplici if
dichiarazioni possono essere sostituiti da ||
o &&
interamente. A volte questo rende il codice più conciso e meno leggibile e più simile a Perl, altre volte consente nuovi modelli Javascript, come opts = opts || {}
.
Un altro utilizzo è nei modelli come
var displayName = user.fullname || user.email;
che significa "utilizzare il nome completo, se disponibile;. Se non, ripiegare per e-mail" Personalmente ritengo che questo sia espressivo e leggibile, ma è discutibilmente terso e oscuro a seconda di quale parte della comunità Javascript provenga. A causa di esempi come questo, ed essenzialmente del fatto che i valori di verità sono molto più diversi dei valori falsi, usare il cortocircuito ||
è molto più comune del cortocircuito &&
, come nella tua domanda.
Vorrei solo sottolineare che questo tipo di comportamento è abbastanza comune nei linguaggi dinamici che consente di utilizzare qualsiasi valore in un contesto booleano (Javascript, Python, Lua, ecc.). C è anche uno strano caso d'angolo in quanto non ha un tipo booleano separato e quindi mix utilizza gli interi per quello. – hugomg